由 applicative 风格组成的 applicative functor 真的是独立的吗?
Are applicative functors composed with the applicative style really independent?
我对函子、应用函子和单子的理解如下:
- 仿函数:可以映射的计算。
- 应用函子:独立 其结果可以组合在一起的计算。
- Monad:(可能但不一定)可以链接的依赖计算。
但是,关于 Applicative 的一些东西与我的理解相冲突...这里是一个 Haskell 解析器的示例,该示例是在使用 applicative 样式的更基本解析器的基础上定义的:
(,) <$> parseName <*> parseEmail
两个解析器 parseName
和 parseEmail
的 effects 不是独立的,因为它们都使用来自同一输入流的标记,例如
Jubobs jubobs@jubobs.io
parseEmail
只能消耗parseName
没有消耗的东西。那么,如何才能说这两个计算是独立的呢?
这里的独立性并不是说一个计算无法检测到其他计算是什么 运行 - 也就是说,parseName 不应该对 parseEmail 没有影响。相反,您不能使用应用 value(由 parseName 解析的名称)来选择应用 computation 到 运行 接下来:您只能解析通用电子邮件,而不是在检查电子邮件地址是否不包含已解析名称的同时解析电子邮件地址。
另一种表达方式是,如果您仅使用应用函数,则您的整体计算 "shape" 是提前预先确定的:您将始终解析名称,然后解析电子邮件地址。如果您使用 monadic 函数,您可以根据先前解析的结果决定接下来要解析的内容,让您可以更改计算的形状,因为它是 运行ning。
我对函子、应用函子和单子的理解如下:
- 仿函数:可以映射的计算。
- 应用函子:独立 其结果可以组合在一起的计算。
- Monad:(可能但不一定)可以链接的依赖计算。
但是,关于 Applicative 的一些东西与我的理解相冲突...这里是一个 Haskell 解析器的示例,该示例是在使用 applicative 样式的更基本解析器的基础上定义的:
(,) <$> parseName <*> parseEmail
两个解析器 parseName
和 parseEmail
的 effects 不是独立的,因为它们都使用来自同一输入流的标记,例如
Jubobs jubobs@jubobs.io
parseEmail
只能消耗parseName
没有消耗的东西。那么,如何才能说这两个计算是独立的呢?
这里的独立性并不是说一个计算无法检测到其他计算是什么 运行 - 也就是说,parseName 不应该对 parseEmail 没有影响。相反,您不能使用应用 value(由 parseName 解析的名称)来选择应用 computation 到 运行 接下来:您只能解析通用电子邮件,而不是在检查电子邮件地址是否不包含已解析名称的同时解析电子邮件地址。
另一种表达方式是,如果您仅使用应用函数,则您的整体计算 "shape" 是提前预先确定的:您将始终解析名称,然后解析电子邮件地址。如果您使用 monadic 函数,您可以根据先前解析的结果决定接下来要解析的内容,让您可以更改计算的形状,因为它是 运行ning。