Maybe
est un type constructor, et ses deux possibles data constructors sont Nothing
et Just
. Donc, vous devez dire Just 5
au lieu de Maybe 5
.
> let x = Just 5
> x
Just 5
> let y = Nothing
> y
Nothing
> :type x
x :: Maybe Integer
> :type y
y :: Maybe a
> :info Maybe
data Maybe a = Nothing | Just a -- Defined in Data.Maybe
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance Monad Maybe -- Defined in Data.Maybe
instance Functor Maybe -- Defined in Data.Maybe
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Show a => Show (Maybe a) -- Defined in GHC.Show
Maybe
est un constructeur de type, car il est utilisé pour construire de nouveaux types (le type de résultat dépend du type de a
dans Maybe a
), où un tel type pourrait être Maybe Int
(avis, il n'y a pas de type param a
plus , c'est-à-dire que tous les paramètres de type sont liés). Just a
et Nothing
sont des constructeurs de données parce qu'ils sont utilisés pour construire des instances d'un certain type Maybe
, par exemple Just Int
crée des instances de Maybe Int
.
Une autre différence majeure est que vous ne pouvez utiliser des constructeurs de données que lors de l'appariement de modèles. Vous ne pouvez pas dire:
case foo of
Maybe a -> ...
que vous aurez à dire:
case foo of
Just a -> ...
Nothing -> ...
Les deux réponses sont tout à fait exact, mais je veux aussi souligner que 'maybe' (minuscule m) * est * une fonction, de type 'b -> (a -> b) -> Peut-être' - 'b': "La fonction maybe peut prendre une valeur par défaut, une fonction, et une valeur Maybe Si la valeur Maybe est Nothing, la fonction renvoie la valeur par défaut, sinon, il applique la fonction à la valeur dans Just et renvoie le résultat. " http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog