2010-11-20 7 views
1

Je suis en train de geler mon cerveau sur les types d'options de f #. J'ai 3 livres et lis tout ce que je peux mais je ne les obtiens pas.Duh? aider avec les types d'options f #

Quelqu'un at-il une explication claire et concise et peut-être un exemple du monde réel?

TIA

Gary

+0

Peut-être voir aussi http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null/3990754#3990754 – Brian

Répondre

2

Voir,

http://msdn.microsoft.com/en-us/library/dd233245.aspx

L'intuition derrière le type d'option est qu'il "met en œuvre" une valeur nulle. Mais contrairement à null, vous devez explicitement exiger qu'une valeur peut être nulle, alors que dans la plupart des autres langages, les références peuvent être nulles par défaut. Il y a une similarité avec SQLs NULL/NOT NULL si vous êtes familier avec ceux-ci.

Pourquoi est-ce intelligent? C'est intelligent parce que le langage peut supposer que aucune sortie de n'importe quelle expression peut jamais être nulle. Par conséquent, il peut éliminer tous les contrôles null-pointeur du code, ce qui donne beaucoup de vitesse supplémentaire. De plus, cela libère le programmeur de devoir vérifier l'absence de casse, s'il veut produire du code sûr.

Pour les quelques cas où un programme nécessite une valeur nulle, le type d'option existe. À titre d'exemple, considérons une fonction qui demande une clé dans un fichier .ini. La clé renvoyée est un entier, mais le fichier .ini peut ne pas contenir la clé. Dans ce cas, il est logique de retourner 'null' si la clé n'est pas trouvée. Aucune des valeurs entières n'est utile - l'utilisateur peut avoir entré exactement cette valeur entière dans le fichier. Par conséquent, nous devons «soulever» le domaine des entiers et lui donner une nouvelle valeur représentant «aucune information», c'est-à-dire la valeur nulle. Donc, nous enveloppons le 'int' dans une 'option int'. Maintenant, s'il n'y a pas de valeur entière, nous obtiendrons 'None' et s'il y a une valeur entière, nous obtiendrons 'Some (N)' où N est la valeur entière en question.

Il y a deux belles conséquences du choix. Premièrement, nous pouvons utiliser les caractéristiques de correspondance de motif générales de F # pour discriminer les valeurs dans, par exemple, une expression de cas. Deuxièmement, le cadre des types de données algébriques utilisés pour définir le type d'option est exposé au programmeur. Autrement dit, s'il n'y avait pas de type d'option dans F #, nous aurions pu le créer nous-mêmes!

5

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.