conduit
and都比 andpipes
成熟得多machines
,但是——也就是说——machines
正试图走一条与conduit
and不同的道路pipes
。
使用machines
,我正在尝试在类型参数方面相对简单的 API。两者conduit
都pipes
选择通过使用 5-6 个不同的类型变量参数来统一他们的所有概念。
Machines 采用不同的方法Plan
在其“输入语言”上参数化机器(或),这将所有责任放在一个额外的参数上(或在 a 的情况下两个Plan
)。此外,通过选择以这种方式参数化输入语言,它开辟了使用可以从多个输入源(非)确定性地接受输入的机器的可能性。结果基本上只是一个带有额外“发射”指令的免费单子!
作为对如何构建和使用机器的更严格政策的交换,它最终可以为结果代码的渐近提供更好的安全性。
也就是说,在现实世界pipes
中conduit
有很多用途,machines
对我来说,或多或少是一个游乐场,Rúnar Bjarnason 和 Paul Chiusano。
它目前适用于处理您打算完全使用的输入,但与使用其他两个 API 获得的相比,它不太适合处理复杂的资源或解析。
现在,关于那个量词!
t
实际上存在量化。通过这样做,我们可以使Monad
for 机器不关心k
参数的功能性。这很重要,因为Source
实施方式。如果我不需要Source
工作,那么我们可以使用更简单的
data Step k o r = Stop
| Yield o r
| Await (k r) r
这将产生不幸的副作用,即当您使用 a 组合 Machine 时Source
,编译器将不知道Functor
要选择哪个实例,并且您会陷入不必要的类型注释中。
存在量化有一个我在处理kan-extensions
包时学到的技巧。它是其中一种Yoneda
类型的概括。