如果你兩個數字範圍之間就像在你的榜樣選擇,我會 只用一個if-then-else
表達:
let realTick population =
let fitness = getFullFitness population
if 0 <= fitness && fitness <= 50 then
population
else
childGeneration population
或簡單後衛:
let realTick population =
match getFullFitness population with
| fitness when 0 <= fitness && fitness <= 50 ->
population
| _ ->
childGeneration population
如果你的實際選擇要複雜得多,那麼你可能需要使用 活動模式。不像@pad,我會用一個參數活躍模式:
let (|BetweenInclusive|_|) lo hi x =
if lo <= x && x <= hi then Some() else None
let realTick population =
match getFullFitness population with
| BetweenInclusive 0 50 ->
population
| _ ->
childGeneration population
一個我發現有時候是有用的高階主動模式是一般 目的謂:
let (|Is|_|) predicate x =
if predicate x then Some() else None
使用Is
你可以寫是這樣的:
let lessEq lo x = x <= lo
let greaterEq hi x = hi <= x
let realTick population =
match getFullFitness population with
| Is (greaterEq 0) & Is (lessEq 50) ->
population
| _ ->
childGeneration population
需要注意的是,雖然這樣的事情是矯枉過正在這樣一個簡單的例子, 它可以在更復雜的情況下方便。我個人使用與此類似的活動 模式在優化 編譯器中實現簡化通過,該編譯器在大量基本操作的例子和爲這些基元提供的參數的屬性上進行模式匹配。