OCaml - Ce que le type de données à certains et pas du tout?
Si je suis en utilisant Some
et None
combo dans une liste de ce que serait le type de données de la liste? Est-il toujours 'a
? Ou est-il une sorte de type de Some
/None
?
let listVar : (* type here *) list = [Some 4; Some 3; None; Some 2];;
Si j'ai mis int
il me donne l'erreur:
Cette expression est de type int option * int option * 'd'une option * int
option, mais est ici utilisé avec le type int
Quand j'ai mis 'a
il compile bien, mais le de base OCaml tutoriel dit (j'ai fait des références à d'autres langues pour expliquer ma question mieux):
Il ne sera pas encore clair pourquoi les fonctions polymorphes sont utiles, mais ils
sont très utiles et très commun, et donc nous allons en discuter plus tard.
(Indice: le polymorphisme est un peu comme les templates en C++ ou génériques en
Java 1.5).
Je pensais que c'était comme référence/pointeur dans d'autres langues, ce qui fait sens. Mais maintenant, je ne comprends vraiment pas quel type est None
. En va de même avec Some
.
Aussi, je sais que je devrais poser deux questions en une seule question, mais celui-ci a une forte relation à la question précédente. Quel est le point de Quelques-uns? J'ai l'habitude de le voir utilisé lorsqu'Aucun n'est utilisé. Si j'en œuvre de la liste ci-dessus sans, il toujours compile mais la structure de la liste n'a pas l'option "option" du pavillon, qui je suppose signifie en option (je ne peux pas l'air de trouver quelque chose sur internet concernant cette). Quelqu'un peut-il me fournir un cas, c'est utile?
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez écrit ici est une valeur de type
(int option * int option * 'a option * int option) list
, c'est à dire une liste de doubles croches dans laquelle les deux premiers composants sont facultatifs entier, la prochaine est polymorphe de la mesure (le cas n'est pas défini encore) et le dernier est un entier. C'est parce que,
est le n-uplet séparateur. Le séparateur de liste est;
donc je suppose que tu voulais écrireDe type
(int option) list
. Chaque fois que vous utilisezSome
ouNone
avec une valeur arbitraire de type'a
vous obtenez une valeur de type'a option
.C'est l'option type, indiquant si elle a une certaine valeur, ou pas.
Si vous venez de Java ou C# ou autre de programmation impératif, lorsque vous voulez revenir un
null
dans une méthode de Java, en OCaml, vous devriez envisager de retourner unNone
Caml a un prédéfini
`a option
type (le`a
signifie qu'il peut être une option de rien, de la même manière qu'un`a list
peut être unint list
, unfloat list
...). C'est en fait un type très simple :Fondamentalement, une valeur de type
`a option
est soitNone
ou une valeur de type`a
mettre à l'intérieur d'une boîte : il n'est pas du même type que`a
(c'est pourquoi vous obtenez une erreur lorsque vous dites que le compilateur de la traiter comme uneint
).Vous devez probablement penser à cela comme une manière explicite de traiter les erreurs (plus explicite que des exceptions). Tenir compte de ces (non la queue récursive, mal écrit) fonctions :
Le premier est de type
`a list -> `a
, ce qui rend possible pour l'appelant pour oublier le vide de la liste de cas. Le second est de type`a list -> `a option
, ce qui signifie que l'erreur de cas seront toujours traitées par l'appelant.Pour le dire d'une autre façon :
None
est quelque peu semblable ànull
, sauf que vous pouvez toujours dire à partir du type d'une fonction de si oui ou non il pourrait revenirNone
(et si il en soit, le compilateur vous oblige à traiter avec elle).Lorsque j'essaie de compiler la solution de code ci-dessus ( @Jbeuh ), j'obtiens le message d'erreur suivant:
J'ai donc décidé d'offrir une solution de rechange solution de code (qui fonctionne):