2017-08-31 16 views
2
  1. Je suis en train de répondre à cette question: "Étant donné le type de données algébriqueType d'instance de classe redéfinissant

    data Maybe a = Nothing | Just a 
    

    ramasser la déclaration d'instance correcte qui montre que le constructeur de type Maybe est un Monad." (Prise d'ici: « DelftX: FP101x Introduction à la programmation fonctionnelle »

  2. La façon dont je suis en train de Anwer est en compilant chaque réponse potenciel à son tour, par exemple, celui-ci.

    instance Monad Maybe where 
          return x = Just x 
          Nothing >>= _ = Nothing 
          (Just x) >>= f = f x 
    
  3. Je ne peux pas le compiler, car il est déjà défini dans le prélude

    HwEx9.hs:16:10: error: 
        Duplicate instance declarations: 
         instance Monad Maybe -- Defined at HwEx9.hs:16:10 
         instance Monad Maybe -- Defined in `GHC.Base' 
    

Ma question est:.? Comment puis-je compiler

+1

meilleure façon: définir votre propre type 'Maybe' semblable. – melpomene

+1

Il est impossible d'éviter l'importation d'une instance de classe de type pour un type donné. (Voir https://stackoverflow.com/a/8731340/6476589) –

+0

Modifier pour MyMaybe? – immibis

Répondre

7

Je voudrais simplement imiter le Maybe type de données, comme:

data Maybe' a = Just' a | Nothing' deriving Show 

instance Monad Maybe' where 
    return x = Just' x 
    Nothing' >>= _ = Nothing' 
    (Just' x) >>= f = f x 

Dans les dernières versions de ghc, cela échouera, car les dernières versions exigent que vous mettre en œuvre aussi bien applicative. Nous pouvons le faire comme:

instance Applicative Maybe' where 
    pure = Just' 
    (Just' f) <*> (Just' x) = Just' (f x) 
    _ <*> _ = Nothing' 

Applicative exige le type d'être une instance de Functor, afin que nous puissions mettre en œuvre comme:

instance Functor Maybe' where 
    fmap f (Just' x) = Just' (f x) 
    fmap _ Nothing' = Nothing' 

Il compilera. L'avantage de cette approche est en outre que l'on peut facilement comparer les deux Maybe monades, par exemple:

*Main> Just 2 >>= (\x -> Just (x+1)) 
Just 3 
*Main> Just' 2 >>= (\x -> Just' (x+1)) 
Just' 3 
+0

Suite à votre conseil (Merci), Comment imiteriez-vous la liste Monad, donnée comme suit: instance Monad [] où return x = [x] xs >> = f = concat (carte f xs) – Atir

+0

'data list '= Vide' | Cons 'a (Liste' a) '. –

+0

Ne devrait pas être: data List 'a = Empty' | Cons 'a (Liste' a) (Merci pour une réponse rapide). – Atir