使用应用风格的应用仿函数是否真的独立?

时间:2016-11-27 19:34:26

标签: haskell applicative

我开始理解仿函数,应用仿函数和monad:

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

然而,有一些关于Applicative的东西与我的理解相冲突......这是一个Haskell示例,它是在使用应用样式的更基本的解析器的基础上定义的解析器:

(,) <$> parseName <*> parseEmail

两个解析器的{em>效果 parseNameparseEmail不是独立的,因为它们都使用来自同一输入流的标记,例如

Jubobs jubobs@jubobs.io

parseEmail只能消耗parseName未使用的内容。那么,如何说这两个计算是独立的呢?

1 个答案:

答案 0 :(得分:16)

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

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