Haskell的pure
功能是否与return
相同?
如果类型已经是Appalative的实例,我就可以使它成为Monad的实例,对吗?因此,我想知道Applicative的pure
是否每次都能与Monad的return
互换吗?
有没有一个例子,它们不一样?
data HelloType a = HelloType { getValue :: a } deriving (Show, Eq)
instance Functor HelloType where
fmap f (HelloType y) = HelloType (f y)
instance Applicative HelloType where
(<*>) (HelloType f) (HelloType x) = HelloType (f x)
pure = HelloType
instance Monad HelloType where
(>>=) (HelloType x) f = f x
-- return = pure
return = HelloType
plus3 :: (Num a) => Maybe a -> HelloType (Maybe a)
plus3 (Just x) = HelloType (Just $ x + 3)
plus3 Nothing = HelloType Nothing
main= do
let withPure = pure (Just 3) >>= plus3 >>= plus3
withReturn = return (Just 3) >>= plus3 >>= plus3
print $ withPure == withReturn -- TRUE
答案 0 :(得分:7)
作为Monad实例的每种类型的return
必须等于pure
。
尤其是,由于Applicative
已成为Monad
的超类,因此不需要定义return
,因为默认情况下它被定义为{{1}的同义词。 }:参见the definition:
此外,Monad和Applicative运算应关联如下:
pure
最小完整定义
pure = return
请注意,最低定义仅要求(>>=)
,而不要求>>=
,并且要求return
(与所有此类“法律”一样,不能由语言强制执行,但必须对于所有“理智”的实现都适用,否则语义将不正确。
但是有些类型是适用的,但不是Monad,因此具有pure = return
但没有pure
。 ZipList
是传统示例。