Si vous devez choisir entre deux plages de numéros comme dans votre exemple, je simplement utiliser une expression if-then-else
:
let realTick population =
let fitness = getFullFitness population
if 0 <= fitness && fitness <= 50 then
population
else
childGeneration population
ou un garde simple:
let realTick population =
match getFullFitness population with
| fitness when 0 <= fitness && fitness <= 50 ->
population
| _ ->
childGeneration population
Si votre choix réel est beaucoup plus compliqué, alors vous pouvez utiliser motifs actifs. Contrairement à @pad, j'utiliser un modèle actif paramétrées:
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
Un modèle actif d'ordre supérieur que j'ai trouvé parfois utile est un prédicat usage général:
let (|Is|_|) predicate x =
if predicate x then Some() else None
En utilisant Is
vous pourriez écrire quelque chose comme ceci:
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
Notez que, alors que quelque chose comme cela est exagéré dans un exemple simple comme celui-ci, il peut être pratique dans des scénarios plus compliqués. Personnellement, j'ai utilisé des modèles similaires pour implémenter une passe de simplification dans un compilateur qui optimisait ce modèle sur un grand nombre de cas d'opérations primitives et les propriétés des paramètres donnés à ces primitives.