Brian's answer a été évalué comme la meilleure explication des types option
, donc vous devriez probablement le lire :-). Je vais essayer d'écrire une explication plus concise en utilisant un exemple F # simple ...
Disons que vous avez une base de données de produits et vous voulez une fonction qui recherche la base de données et renvoie le produit avec un nom spécifié. Que devrait faire la fonction quand il n'y a pas un tel produit? Lorsque vous utilisez null
, le code pourrait ressembler à ceci:
Product p = GetProduct(name);
if (p != null)
Console.WriteLine(p.Description);
Un problème avec cette approche est que vous n'êtes pas obligé d'effectuer la vérification, de sorte que vous pouvez facilement écrire du code qui jetteront une exception inattendue lorsque le produit n'est pas trouvé:
Product p = GetProduct(name);
Console.WriteLine(p.Description);
Lorsque vous utilisez le type option
, vous faites la possibilité de valeur manquante explicite.Types définis dans F # ne peuvent pas avoir une valeur null
et quand vous voulez écrire une fonction qui peut ou peut ne pas retourner la valeur, vous ne pouvez pas revenir Product
- au contraire, vous devez retourner option<Product>
, de sorte que le code ci-dessus ressemblerait à ceci (j'ai ajouté des annotations de type , de sorte que vous pouvez voir les types):
let (p:option<Product>) = GetProduct(name)
match p with
| Some prod -> Console.WriteLine(prod.Description)
| None ->() // No product found
vous ne pouvez pas accéder directement à la propriété Description
, parce que le reuslt de la recherche n'est pas Product
. Pour obtenir la valeur Product
réelle, vous devez utiliser la correspondance de modèle, ce qui vous oblige à gérer le cas lorsqu'une valeur est manquante.
Résumé. En résumé, le but du type option
est de rendre explicite l'aspect de "valeur manquante" dans le type et de vous forcer à vérifier si une valeur est disponible chaque fois que vous travaillez avec des valeurs qui pourraient éventuellement être manquantes.
Peut-être voir aussi http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null/3990754#3990754 – Brian