【问题标题】:Are applicative functors composed with the applicative style really independent?由applicative style组成的applicative functor真的是独立的吗?
【发布时间】:2017-04-11 12:16:08
【问题描述】:

我对函子、应用函子和单子的理解如下:

  • 仿函数:可以映射的计算。
  • 应用函子:独立计算,其结果可以组合在一起。
  • Monad:(可能但不一定)可以链接的依赖计算。

但是,Applicative 有一些与我的理解相冲突的地方……这是一个 Haskell 示例,它是在使用 applicative 样式的更基本的解析器的基础上定义的解析器:

(,) <$> parseName <*> parseEmail

parseNameparseEmail 这两个解析器的效果不是独立的,因为它们都使用来自同一输入流的令牌,例如

Jubobs jubobs@jubobs.io

parseEmail 只能消费 parseName 没有消费的东西。那么,如何才能说这两个计算是独立的呢?

【问题讨论】:

  • 仅仅因为应用函子公开了一个可用于独立计算的接口,并不意味着满足该接口的所有东西都是可并行的。解析器本质上是顺序的。
  • 我猜您对“独立”的直觉与以下事实有关,与 Monad 不同,您的 parseName 解析器无法使用 已解析 电子邮件“返回“parseEmail。但当然Applicative 只不过是类及其相关的法律。

标签: haskell applicative


【解决方案1】:

这里的独立性并不是说一个计算不能检测到其他计算已经运行 - 也就是说,不应该是 parseName 对 parseEmail 没有影响的情况。相反,您不能使用 applicative value(由 parseName 解析的名称)来选择接下来要运行的 applicative computation:您只能解析通用电子邮件,而不是比说,在检查电子邮件地址不包含解析后的名称时解析它。

另一种说法是,如果您只使用应用函数,则计算的整体“形状”是提前预先确定的:您将始终解析一个名称,然后是一个电子邮件地址。如果您使用单子函数,您可以根据之前解析的结果来决定接下来要解析什么,让您在计算运行时更改其形状。

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 2011-11-05
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多