Options (F#)
En F#, le type d'option est utilisé lorsqu'une valeur réelle peut ne pas exister pour une valeur nommée ou variable. Une option a un type sous-jacent et peut contenir une valeur de ce type ou ne pas avoir de valeur.
Notes
Le code suivant illustre l'utilisation du type d'option.
let keepIfPositive (a : int) = if a > 0 then Some(a) else None
La valeur None est utilisée lorsqu'une option n'a pas de valeur réelle. Sinon, l'expression Some( ... ) donne une valeur à l'option. Les valeurs Some et None sont utiles dans les critères spéciaux, comme dans la fonction exists suivante, qui retourne la valeur true si l'option a une valeur et false dans le cas contraire.
let exists (x : int option) =
match x with
| Some(x) -> true
| None -> false
Utilisation d'options
Les options sont communément utilisées lorsqu'une recherche ne retourne pas de résultat correspondant, comme indiqué dans le code suivant.
let rec tryFindMatch pred list =
match list with
| head :: tail -> if pred(head)
then Some(head)
else tryFindMatch pred tail
| [] -> None
// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]
// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]
Dans le code précédent, une recherche récursive est effectuée sur une liste. La fonction tryFindMatch prend une fonction de prédicat pred qui retourne une valeur booléenne, et une liste à rechercher. Si un élément qui satisfait au prédicat est trouvé, la récursivité se termine et la fonction retourne la valeur comme option dans l'expression Some(head). La récursivité se termine lorsque la liste vide est mise en correspondance. À ce stade, la valeur head n'a pas été trouvée, et None est retourné.
Bon nombre de fonctions de bibliothèque F# qui recherchent, dans une collection, une valeur susceptible d'exister ou non, retournent le type option. Par convention, ces fonctions commencent par le préfixe try, par exemple, Seq.tryFindIndex.
Les options peuvent également être utiles lorsqu'une valeur est susceptible de ne pas exister, par exemple s'il est possible qu'une exception soit levée lorsque vous essayez de construire une valeur. L'exemple de code suivant illustre ceci.
open System.IO
let openFile filename =
try
let file = File.Open (filename, FileMode.Create)
Some(file)
with
| ex -> eprintf "An exception occurred with message %s" ex.Message
None
La fonction openFile de l'exemple précédent a le type string -> File option, car elle retourne un objet File si le fichier s'ouvre et None en cas d'exception. Selon la situation, il peut ne pas s'avérer judicieux en termes de conception d'intercepter une exception plutôt que de la laisser se propager.
Propriétés et méthodes des options
Le type d'option prend en charge les propriétés et méthodes suivantes.
Propriété ou méthode |
Type |
Description |
---|---|---|
'T option |
Propriété statique qui vous permet de créer une valeur d'option qui a la valeur None. |
|
bool |
Retourne la valeur true si l'option a la valeur None. |
|
bool |
Retourne la valeur true si l'option a une valeur qui n'est pas None. |
|
'T option |
Membre statique qui crée une option qui a une valeur qui n'est pas None. |
|
'T |
Retourne la valeur sous-jacente ou lève une NullReferenceException si la valeur est None. |
Module Option
Le module Option contient des fonctions utiles qui effectuent des opérations sur des options. Certaines fonctions répètent les fonctionnalités des propriétés, mais sont utiles dans les contextes où une fonction est exigée. Option.isSome et Option.isNone sont deux fonctions de module qui testent si une option contient une valeur. Option.get obtient la valeur, s'il y en a une. S'il n'y a aucune valeur, ArgumentException est levée.
La fonction Option.bind exécute une fonction sur la valeur, s'il y a une valeur. La fonction doit prendre un argument exactement, et son type de paramètre doit être le type d'option. La valeur de retour de la fonction est un autre type d'option.
Le module Option inclut également des fonctions qui correspondent aux fonctions disponibles pour les listes, tableaux, séquences et autres types de collection. Ces fonctions incluent Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold et Option.count. Ces fonctions permettent d'utiliser les options comme une collection de zéro ou un élément. Pour plus d'informations et d'exemples, consultez la discussion portant sur les fonctions de collection dans Listes.
Conversion en d'autres types
Les options peuvent être converties en listes ou tableaux. Lorsqu'une option est convertie en l'une ou l'autre de ces structures de données, la structure de données résultante a zéro ou un élément. Pour convertir une option en tableau, utilisez Option.toArray. Pour convertir une option en liste, utilisez Option.toList.