Haskell 示例,其中 pure 和 return 不可互换

Haskell example where pure and return not interchangeable

Haskell的pure功能和return一样吗?

如果类型已经是 Applicative 的实例,我就可以将它设为 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

作为 Monad 实例的每个类型都必须使其 return 等于 pure

特别是,由于 ApplicativeMonad 的超类,因此不需要定义 return,因为默认情况下它被定义为 [= 的同义词12=]:见 the definition:

Furthermore, the Monad and Applicative operations should relate as follows:

  • pure = return

Minimal complete definition

(>>=)

请注意,最小定义只需要 >>=,不需要 return,并且 pure = return 的要求(与所有此类 "laws" 一样,无法通过语言,但必须适用于所有 "sane" 实现,否则语义将不正确)。

但是有些类型是 Applicative 而不是 Monad,因此有 pure 但没有 returnZipList是传统的例子。