繁体   English   中英

应用函子方面的一元序列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM