机器和管道(或其他类似的库)之间的概念差异是什么?

时间:2013-06-24 17:36:43

标签: haskell conduit transducer-machines

我想学习这个概念,这样我就能理解和使用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 类库和机器之间的概念差异是什么?

1 个答案:

答案 0 :(得分:45)

conduitpipes都比machines要成熟得多,但是 - 表示 - machines试图采取与{{1}不同的路径}和conduit

使用pipes,我正在尝试在类型参数方面使用相对简单的API。 machinesconduit都选择使用5-6种不同的类型变量参数来统一所有概念。

机器采用不同的方法在其“输入语言”上参数化机器(或pipes),这使得所有的责任都放在一个额外的参数上(或者在Plan的情况下为2) )。此外,通过选择以这种方式参数化输入语言,它开辟了使用可以从多个输入源确定性地接受输入(非)的机器的可能性。结果基本上只是一个带有额外“发射”指令的免费monad!

作为对如何构建和使用机器的更严格的政策的交换,它最终可以为所得代码的渐近性提供更好的安全性。

尽管如此,Planpipes已经有很多现实世界的使用,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类型之一的推广。