“Functor, Applicative 和 Monad”的版本间的差异
跳到导航
跳到搜索
(未显示同一用户的1个中间版本) | |||
第1行: | 第1行: | ||
[[Category:Haskell]] | [[Category:Haskell]] | ||
+ | == Functor == | ||
+ | |||
+ | <code>Functor</code> 可被想象成 Mappable。 | ||
+ | |||
+ | == Applicative == | ||
+ | |||
+ | == Monad == | ||
+ | |||
+ | === 相关函数 === | ||
+ | |||
+ | ;<code>(>>=)</code>: bind | ||
+ | ;<code>(>>)</code>: then 运算符。忽略上一个 Monad 的结果 | ||
+ | ;<code>(>=>)</code>: monad 复合,<code>(bs >=> cs) a</code> 可理解为 {{code|haskell|do { b <- bs a; cs b }<nowiki/>}} | ||
+ | ;<code>(<=<)</code>: <code>flip (>=>)</code>,就像 <code>(.)</code> 运算符<ref>[[wikibooks:Haskell/Understanding_monads#Monadic_composition]]</ref> | ||
+ | |||
== 关系 == | == 关系 == | ||
2021年7月11日 (日) 03:46的最新版本
Functor
Functor
可被想象成 Mappable。
Applicative
Monad
相关函数
(>>=)
- bind
(>>)
- then 运算符。忽略上一个 Monad 的结果
(>=>)
- monad 复合,
(bs >=> cs) a
可理解为do { b <- bs a; cs b }
(<=<)
flip (>=>)
,就像(.)
运算符[1]
关系
Monad
是 Applicative
的 superclass,Applicative
是 Functor
的 superclass。
相关函数的关系
对于一个 Monad
:
liftM
与fmap
可互换ap
与(<*>)
可互换return
与pure
可互换
运用
需要给一个类型实现 Monad
时,应从 Functor
开始实现,再实现 Applicative
和 Monad
。如下
instance Functor Foo where
fmap = -- etc.
instance Applicative Foo where
pure = -- etc.
(<*>) = -- etc.
instance Monad Foo where
(>>=) = -- etc.
但由于 return
是 Monad
版本的 pure
,ap
是 Monad
版本的 (<*>)
,为了方便也可如下实现[2]
instance Monad Foo where
return = -- etc.
(>>=) = -- etc.
instance Applicative Foo where
pure = return
(<*>) = ap
instance Functor Foo where
fmap = liftM