【发布时间】:2017-04-11 12:16:08
【问题描述】:
我对函子、应用函子和单子的理解如下:
- 仿函数:可以映射的计算。
- 应用函子:独立计算,其结果可以组合在一起。
- Monad:(可能但不一定)可以链接的依赖计算。
但是,Applicative 有一些与我的理解相冲突的地方……这是一个 Haskell 示例,它是在使用 applicative 样式的更基本的解析器的基础上定义的解析器:
(,) <$> parseName <*> parseEmail
parseName 和 parseEmail 这两个解析器的效果不是独立的,因为它们都使用来自同一输入流的令牌,例如
Jubobs jubobs@jubobs.io
parseEmail 只能消费 parseName 没有消费的东西。那么,如何才能说这两个计算是独立的呢?
【问题讨论】:
-
仅仅因为应用函子公开了一个可用于独立计算的接口,并不意味着满足该接口的所有东西都是可并行的。解析器本质上是顺序的。
-
我猜您对“独立”的直觉与以下事实有关,与
Monad不同,您的parseName解析器无法使用 已解析 电子邮件“返回“parseEmail。但当然Applicative是 只不过是类及其相关的法律。
标签: haskell applicative