[英]Monadic sequence in terms of applicative functors
假设我们有一个单子序列:
doSomething = do
a <- f
b <- g
c <- h
pure (a, b, c)
我们可以使用 applicative functor 轻松地重写它:
doSomething2 = (,,) <$> f <*> g <*> h
但是如果单子序列看起来像这样:
doSomething' n = do
a <- f n
b <- g a
c <- h b
pure (a, b, c)
那里仍然可以使用应用程序吗? 如果没有,障碍是什么? (也写在一本书中,尽管如此,我们可以使用 applicative 和join
together,但我不知道如何)。
不,这正是 Monad 相比 Applicative 带来的额外力量。 fa
类型的单子或应用值可以被认为是两部分:“效果”(发生在f
数据结构中的东西)和“值”(发生在类型a
的值中的东西)。 使用 Applicative,效果不可能依赖于值,因为 Applicative 中的函数无法将函数的结果(值)编织回效果中。 Monad 中的(>>=)
function 为您提供了这种能力; join
同样强大。
关键是(>>=)
的签名包含一个看起来像(a -> mb)
的 function :您可以查看一个纯值( a
),然后根据它选择一个效果(mb)
。 相比
(>>=) :: Monad m => (a -> m b) -> m a -> m b
至
fmap :: Functor f => (a -> b) -> f a -> f b
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
最后两个仅接受完全在值 realm: (a -> b)
中运行的函数,因此无法根据值确定结构/效果。
当然你仍然可以对这个do
表示法进行去糖,但是你必须在结果中使用一元操作:
doSomething'' n =
f n >>= (\a ->
g a >>= (\b ->
h b >>= (\c ->
pure (a, b, c))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.