haskell - Machines 和 Conduits(或其他类似库)之间的概念区别是什么?

我想学习这个概念,以便能够理解和使用 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是以及为什么要量化。或者,类似管道的库和机器之间的概念区别是什么?

最佳答案

conduitpipes都比 machines 成熟得多, 但是 -- 那就是 -- machines正试图采用与 conduit 不同的路径和 pipes .

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

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

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

也就是说,pipesconduit有很多现实世界的使用和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/

相关文章:

clojure - 为什么 Datomic 属性以驼峰命名

css - 由于非整数宽度,媒体查询运行异常

datetime - 如何在Lua中的给定日期时间添加天数

macos - 如何使用 xhyve 从主机中删除 Minikube 主机路径目录?

sandbox - 转移 Mac App Store 应用程序

c - 这个函数被认为是可重入的吗?

pointers - SGX - 受信任的网桥和受信任的代理有什么区别?

visual-studio - 如何在 Visual Studio 2015(对于 C++)中仅禁用

python-3.x - 模块 'urllib' 没有属性 'request'

scala - 为什么 Scala 没有为每个 monad 定义返回/单元函数(与 Haskell