2017-08-31 152 views
2
  1. 我試圖回答這個問題: 「鑑於代數數據類型類型的類實例重新定義

    data Maybe a = Nothing | Just a 
    

    選擇正確的實例聲明表明這些類型構造MaybeMonad。」 (取自這裏:「DelftX:FP101x介紹函數編程」

  2. 我想ANWER它是由編譯依次在每個potencial答案,例如方式,這一個:

    instance Monad Maybe where 
          return x = Just x 
          Nothing >>= _ = Nothing 
          (Just x) >>= f = f x 
    
  3. ,因爲它是在前奏中已經定義我不能編譯

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

我的問題是:?我如何編譯

+1

最簡單的方法:定義你自己的'Maybe'樣型。 – melpomene

+1

沒有辦法避免爲給定類型導入類型類實例。 (另見https://stackoverflow.com/a/8731340/6476589) –

+0

將其更改爲MyMaybe? – immibis

回答

7

我只想模仿Maybe數據類型,如:

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

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

ghc過去的版本中,這將失敗,因爲最後一個版本需要您實現的應用性爲好。我們可以做到這一點,如:

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

Applicative需要的類型是Functor一個實例,所以我們可以實現它想:

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

它將再編譯。這種方法的優點是進一步,我們可以很容易地比較兩個Maybe單子,例如:

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

按照你的建議(謝謝),你會如何模仿Monad列表,如下所示:instance Monad [] return x = [x] xs >> = f = concat(map f xs) – Atir

+0

'data List '=空'|缺點'(列表'a)'。 –

+0

不應該是:數據列表'a =空'|缺點'(列表'a)(謝謝你快速回答)。 – Atir