Haskell示例,其中纯净和收益不可互换

时间:2019-02-18 15:42:51

标签: haskell monads applicative

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

1 个答案:

答案 0 :(得分:7)

作为Monad实例的每种类型的return必须等于pure

尤其是,由于Applicative已成为Monad的超类,因此不需要定义return,因为默认情况下它被定义为{{1}的同义词。 }:参见the definition

  

此外,Monad和Applicative运算应关联如下:

     
      
  • pure
  •   
  

最小完整定义

pure = return

请注意,最低定义仅要求(>>=) ,而不要求>>=,并且要求return(与所有此类“法律”一样,不能由语言强制执行,但必须对于所有“理智”的实现都适用,否则语义将不正确。

但是有些类型是适用的,但不是Monad,因此具有pure = return但没有pureZipList是传统示例。