我想回答这个问题: "给定代数数据类型
data Maybe a = Nothing | Just a
选择正确的实例声明,该声明显示类型构造函数Maybe
是Monad
。" (摘自此处:" DelftX:FP101x功能编程简介"。
我试图解决它的方法是依次编译每个潜在的答案,例如,这个:
instance Monad Maybe where
return x = Just x
Nothing >>= _ = Nothing
(Just x ) >>= f = f x
我无法编译它,因为它已在前奏中定义。
HwEx9.hs:16:10: error:
Duplicate instance declarations:
instance Monad Maybe -- Defined at HwEx9.hs:16:10
instance Monad Maybe -- Defined in `GHC.Base'
我的问题是:如何编译它?
答案 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