我想学习这个概念,以便能够理解和使用 machines 等库。 .
我试着关注 Rúnar Bjarnason's talk on machines ,但是资料太少,基本上就是一堆数据类型。我什至无法理解 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
是以及为什么要量化。或者,类似管道的库和机器之间的概念区别是什么?
最佳答案
conduit
和 pipes
都比 machines
成熟得多, 但是 -- 那就是 -- machines
正试图采用与 conduit
不同的路径和 pipes
.
与 machines
,我正在尝试在类型参数方面相对简单的 API。两个conduit
和 pipes
已经选择通过使用 5-6 个不同的类型变量参数来统一他们的所有概念。
Machines 采用不同的方法对机器(或 Plan
)的“输入语言”进行参数化,这将所有责任放在一个额外的参数上(或在 Plan
的情况下为两个)。此外,通过选择以这种方式参数化输入语言,它开辟了使用可以从多个输入源(非)确定性地接受输入的机器的可能性。结果基本上只是一个带有额外“发射”指令的免费单子(monad)!
作为对如何构建和使用机器的更严格政策的交换,它最终可以为结果代码的渐近提供更好的安全性。
也就是说,pipes
和 conduit
有很多现实世界的使用和machines
对我来说,或多或少是一个游乐场,Rúnar Bjarnason 和 Paul Chiusano。
它目前适用于处理您打算完全使用的输入,但与使用其他两个 API 获得的相比,它不太适合处理复杂的资源或解析。
现在,关于那个量词!t
实际上存在量化。通过这样做,我们可以制作 Monad
对于不关心 k
功能性的机器范围。这很重要,因为 Source
的方式被实现。如果我不需要 Source
工作,那么我们可以使用更简单的
data Step k o r = Stop
| Yield o r
| Await (k r) r
Source
组合机器时,编译器不知道 Functor
要选择的实例,您将在不必要的类型注释中游泳。kan-extensions
时学到的一个技巧包裹。它是 Yoneda
之一的概括。类型从那里。
https://stackoverflow.com/questions/17281556/