2011-10-30 7 views
10

Je ne comprends pas pourquoi je reçois la réponse suivante de GHCi. N'est-ce pas Maybe une fonction de constructeur?Haskell débutant

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

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

Répondre

6

Maybe est le nom du type. Les constructeurs de ce type sont Just et Nothing, donc une valeur réelle du type Maybe est soit de la forme Just 5 (pour les cas où il y a une valeur que vous voulez retourner) ou Nothing (pour le cas vide).

+0

@delnan: Oui, déjà résolu cela. Merci de l'avoir attrapé, cependant. Je pensais à OCaml. – Chuck

25

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

Il semble que la lecture du tutoriel jusqu'à présent me laisse un peu confus entre le constructeur de type et le constructeur de données. La syntaxe est la même et selon le paragraphe joint du tutorial Just a est aussi un constructeur de type (??) Les types paramétrés sont similaires aux types "génériques" ou "templates" dans d'autres langages. Un type paramétré prend un ou plusieurs paramètres de type. Par exemple, le type Standard Prelude Maybe est défini comme suit: data Peut-être a = Nothing | Juste un –

+0

@DavidKramf mettre à jour ma réponse. Tenez-moi au courant si vous trouvez toujours quelque chose de flou. –

+0

@ Ionuţ G. Stan: le 'a' dans' b :: Peut-être a' n'est pas le même 'a' que vous avez défini. Peut-être devriez-vous utiliser les variables 'x',' y' au lieu de 'a',' b' pour éviter de heurter des lettres? – Nefrubyr