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

jub*_*0bs 4 haskell applicative

我来了解仿函数,applicative仿函数和monad如下:

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

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

(,) <$> parseName <*> parseEmail
Run Code Online (Sandbox Code Playgroud)

影响的两个分析器的,parseName并且parseEmail,不是独立的,因为它们都消耗从相同的输入流,例如令牌

Jubobs jubobs@jubobs.io
Run Code Online (Sandbox Code Playgroud)

parseEmail只能消耗尚未消耗的东西parseName.那么,如何说这两个计算是独立的呢?

ama*_*loy 16

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

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