我想学习这个概念,这样我就能理解和使用machines之类的库。
我试图关注Rúnar Bjarnason's talk on machines,但信息太少,基本上只是一堆数据类型。我甚至无法理解<{1}}在
中的含义k
或newtype Machine k o = Step k o (Machine k o)
data Step k o r = Stop
| Yield o r
| forall t . Await (t -> r) (k t) r
是什么以及为何量化。或者, conduit 类库和机器之间的概念差异是什么?
答案 0 :(得分:45)
conduit
和pipes
都比machines
要成熟得多,但是 - 表示 - machines
试图采取与{{1}不同的路径}和conduit
。
使用pipes
,我正在尝试在类型参数方面使用相对简单的API。 machines
和conduit
都选择使用5-6种不同的类型变量参数来统一所有概念。
机器采用不同的方法在其“输入语言”上参数化机器(或pipes
),这使得所有的责任都放在一个额外的参数上(或者在Plan
的情况下为2) )。此外,通过选择以这种方式参数化输入语言,它开辟了使用可以从多个输入源确定性地接受输入(非)的机器的可能性。结果基本上只是一个带有额外“发射”指令的免费monad!
作为对如何构建和使用机器的更严格的政策的交换,它最终可以为所得代码的渐近性提供更好的安全性。
尽管如此,Plan
和pipes
已经有很多现实世界的使用,conduit
或多或少是我的游乐场,RúnarBjarnason和Paul Chiusano。
它目前适合处理您打算完全使用的输入,但对于处理复杂资源或解析而言,不如使用其他两个API所获得的那样。
现在,关于那个量词!
machines
实际存在量化。通过这样做,我们可以使t
机器不关心Monad
参数的功能性。这很重要,因为k
的实施方式。如果我不需要Source
工作,那么我们可以使用更简单的
Source
这会产生令人遗憾的副作用,当你去编写一台data Step k o r = Stop
| Yield o r
| Await (k r) r
的机器时,编译器不知道要选择什么Source
实例并且你要游泳不必要的类型注释。
存在量化是我在处理Functor
包时所采用的技巧。它是kan-extensions
类型之一的推广。