Maybe
è un type constructor, e la sua due possibili data constructors sono Nothing
e Just
. Quindi devi dire Just 5
invece di 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
è un tipo di costruzione, perché è usato per costruire nuovi tipi (il tipo di risultato dipende dal tipo di a
in Maybe a
), dove un tale tipo potrebbe essere Maybe Int
(avviso, non c'è alcun tipo di param a
più , cioè tutti i parametri del tipo sono vincolati). Just a
e Nothing
sono costruttori di dati perché sono utilizzati per creare istanze di un determinato tipo Maybe
, ad esempio Just Int
crea istanze di Maybe Int
.
Un'altra importante differenza è che è possibile utilizzare solo i costruttori di dati durante la corrispondenza del modello. Non si può dire:
case foo of
Maybe a -> ...
dovrete dire:
case foo of
Just a -> ...
Nothing -> ...
fonte
2011-10-30 20:11:29
Entrambe le risposte sono esattamente a destra, ma voglio anche sottolineare che 'maybe' (m minuscola) * è * una funzione, di tipo 'b -> (a -> b) -> Forse a -> b':" La funzione forse prende un valore predefinito, una funzione e un valore Forse. Se il valore Forse è Niente, la funzione restituisce il valore predefinito, altrimenti applica la funzione al valore contenuto nel Just e restituisce il risultato. " http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog