29

我想学习这个概念,以便能够理解和使用机器等库。

我尝试关注Rúnar Bjarnason 关于机器的演讲,但信息太少,基本上只是一堆数据类型。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

或者是什么t以及为什么要量化。或者,类似管道的库和机器之间的概念区别是什么?

4

1 回答 1

45

conduitand都比 andpipes成熟得多machines,但是——也就是说——machines正试图走一条与conduitand不同的道路pipes

使用machines,我正在尝试在类型参数方面相对简单的 API。两者conduitpipes选择通过使用 5-6 个不同的类型变量参数来统一他们的所有概念。

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

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

也就是说,在现实世界pipesconduit有很多用途,machines对我来说,或多或少是一个游乐场,Rúnar Bjarnason 和 Paul Chiusano。

它目前适用于处理您打算完全使用的输入,但与使用其他两个 API 获得的相比,它不太适合处理复杂的资源或解析。

现在,关于那个量词!

t实际上存在量化。通过这样做,我们可以使Monadfor 机器不关心k参数的功能性。这很重要,因为Source实施方式。如果我不需要Source工作,那么我们可以使用更简单的

data Step k o r = Stop
                | Yield o r
                | Await (k r) r

这将产生不幸的副作用,即当您使用 a 组合 Machine 时Source,编译器将不知道Functor要选择哪个实例,并且您会陷入不必要的类型注释中。

存在量化有一个我在处理kan-extensions包时学到的技巧。它是其中一种Yoneda类型的概括。

于 2013-06-24T18:04:40.757 回答