2017-08-31 4 views
2
  1. Ich versuche, diese Frage zu beantworten: „den algebraischen Datentyp BeiTyp Klasseninstanz neu zu definieren

    data Maybe a = Nothing | Just a 
    

    die richtigen Instanz Erklärung auswählen, die zeigt, dass der Typkonstruktor Maybe ein Monad ist.“ (Von hier genommen: „DelftX: FP101x Einführung in die funktionale Programmierung“

  2. Der Weg den ich versuche anwer es durch die Zusammenstellung jedes potencial Antwort wiederum ist zum Beispiel diese:.

    instance Monad Maybe where 
          return x = Just x 
          Nothing >>= _ = Nothing 
          (Just x) >>= f = f x 
    
  3. ich kann es nicht kompilieren, weil es bereits in der Einleitung definiert ist

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

Meine Frage lautet:. Wie kann ich es kompilieren

+1

Der einfachste Weg: Definieren Sie Ihren eigenen 'Maybe' artigen Typen. – melpomene

+1

Es gibt keine Möglichkeit, den Import einer Typklasseninstanz für einen bestimmten Typ zu vermeiden. (siehe weiter https://StackOverflow.com/a/8731340/6476589) –

+0

Ändern Sie es zu MyMaybe? – immibis

Antwort

7

Ich würde einfach imitiert den Maybe Datentyp, wie:

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

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

In den letzten Versionen von ghc, wird dies nicht gelingen, da die letzten Versionen, dass Sie applicative auch implementieren erfordern. Wir können diese wie tun:

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

Applicative den Typ erfordert eine Instanz von Functor sein, so können wir implementieren es mögen:

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

Es wird dann kompilieren. Der Vorteil dieses Ansatzes ist es weiterhin, dass wir einfach die beide Maybe Monaden, zum Beispiel vergleichen:

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

Folgen Sie Ihrem Rat (Danke), Wie würden Sie die Liste Monad nachahmen, wie folgt angegeben: Instanz Monad [] zurück x = [x] xs >> = f = concat (Karte f xs) – Atir

+0

'Datenliste '= Leer' | Cons 'a (Liste a) '. –

+0

Sollte nicht: Datenliste 'a = Leer' | Cons 'a (Liste' a) (Danke für eine schnelle Antwort). – Atir

Verwandte Themen