2017-08-31 136 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