2011-10-30 15 views
10

Non capisco perché ottengo la seguente risposta da GHCi. Maybe non è una funzione di costruzione?Principiante Haskell

Prelude> :t Maybe 

<interactive>:1:1: Not in scope: data constructor `Maybe' 
Prelude> let e = Maybe 5 

<interactive>:1:9: Not in scope: data constructor `Maybe' 
+0

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

risposta

6

Maybe è il tipo nome. I costruttori di quel tipo sono Just e Nothing, quindi un valore effettivo del tipo Forse è del formato Just 5 (per i casi in cui è presente un valore che si desidera restituire) o Nothing (per il caso vuoto).

+0

@delnan: Sì, già risolto. Grazie per la cattura, però. Stavo pensando a OCaml. – Chuck

25

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 -> ... 
+1

Sembra che leggere il tutorial finora mi lasci un po 'confuso tra il costruttore di tipi e il costruttore di dati. La sintassi è la stessa e secondo il paragrafo allegato dal tutorial Just a è anche un costruttore di tipi (??) I tipi parametrizzati sono simili ai tipi "generici" o "modello" in altre lingue. Un tipo parametrico accetta uno o più parametri di tipo. Ad esempio, il tipo Preludio standard Forse è definito come segue: dati Forse a = Nothing | Solo un –

+0

@DavidKramf aggiorna la mia risposta. Tienimi aggiornato se trovi ancora qualcosa di poco chiaro. –

+0

@ Ionuţ G. Stan: il 'a' in' b :: Maybe a' non è lo stesso 'a' che hai definito. Forse dovresti usare le variabili 'x',' y' invece di 'a',' b' per evitare di scontrare le lettere? – Nefrubyr