键入类实例重新定义

时间:2017-08-31 18:14:09

标签: haskell duplicates instance monads redefinition

  1. 我想回答这个问题: "给定代数数据类型

    data Maybe a = Nothing | Just a
    

    选择正确的实例声明,该声明显示类型构造函数MaybeMonad。" (摘自此处:" DelftX:FP101x功能编程简介"。

  2. 我试图解决它的方法是依次编译每个潜在的答案,例如,这个:

    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'
    
  4. 我的问题是:如何编译它?

1 个答案:

答案 0 :(得分: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的最新版本中,这将失败,因为最后版本也要求您实现applicative。我们可以这样做:

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 monad,例如:

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