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
。
特别是,由于 Applicative
是 Monad
的超类,因此不需要定义 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
但没有 return
。 ZipList
是传统的例子。
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
。
特别是,由于 Applicative
是 Monad
的超类,因此不需要定义 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
但没有 return
。 ZipList
是传统的例子。