在Mark Seemann的博客文章和示例中,我第一次看到了免费单子作为构建纯代码和IO代码之间边界的一种方式。我的基本理解是,一个免费的单子可以让您构建一个纯函数的程序(抽象语法树-AST),然后解释器将其翻译成一系列不纯的过程调用。因此,这个解释器将AST的纯操作转换为一系列的一元IO操作。
我想知道这是否复制了Haskell运行时已经在IO Monad上做的事情。如果我认为IO没有什么特别的,而是一个规则的单子,它的绑定函数>>>=
通过IO中的所有单子操作对“现实世界”的状态进行排序,那么这种排序本身并不提供任何计算(正如这里优秀的答案中对自由单子的解释)。然后,我可以将getline
、writefile
等所有IO操作作为自由IO monad中的操作查看,并将Haskell运行时作为解释器查看。运行时通过一些底层系统调用、C FFI调用或类似的方式来解释每个IO操作,这显然是不纯的。
因此,在这个视图中,返回IO操作的函数只是构建AST,然后由Haskell运行时解释。但到目前为止,一切都是纯净的。在这个视图中,函数a->IO b
不是不纯的,就像自由单子中的操作不是不纯的一样。
这种直觉正确吗?如果没有,它在哪里做得不够?
您的直觉是正确的:io
类型的函数确实建立了一个操作树,然后由运行时解释。嗯,至少这是一个有效的看待它的方式(也见威尔·内斯的评论)。
与自由单子的区别在于只有一个解释器。你不能选择另一个,你不能实施自己的如果你想。
自由单子的AST有两个主要性质:第一,它是组成的;第二,它是可分析的。解释器可以通过对AST的构造函数进行匹配来分析AST,并相应地执行解释。
我看到自由单子这个词时不时地出现了一段时间,但每个人似乎只是在使用/讨论它们,而没有给出它们是什么的解释。那么:什么是自由单子?(我会说我熟悉单子和Haskell基础,但对范畴理论只有非常粗略的知识。)
在范畴理论中,一个单子是两个伴随函子的组合。例如,也许单子是由遗忘函子组成的自由点集函子。同样地,列表单子是由遗忘函子组成的自由么半函子。 半群是最简单的代数结构之一,所以我想知道编程是否可以从更复杂的结构中受益。我在标准的Haskell包中没有找到免费的组单子,所以我将在这里定义它 自由环和向量空间(它们总是自由的)呢? 对于任何代数结构,一个范畴自由函子的存在意味着Haskell调用fold的
我想弄清楚Meteor是如何和close一起工作的。木卫一。文档 例如,我们有一个curl命令从close中检索单个Lead。木卫一 使用API密钥。流星有方法 所以我们可以像这样使用这个url 但是我们如何在这里应用API密钥呢?
我写了一个jsp页面上传图像使用POST方法通过使用实际上文件是成功上传和后值也得到正确的,但它是抛出一个异常
我不知道免费单子是用来做什么的,也不知道单子转换器库是什么。我也听说过mtl和自由单子的辩论,但我不确定是什么,因为我在互联网上找不到任何关于这一点的讨论。 有人能解释一下这场争论是关于什么的吗?
我需要使用jwt验证令牌。木卫一 为此,我有一个令牌(许可证)eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRJZCI6MjcwMzYwLCJwYWNrYWdlc............" 和json(证书) “密钥”:[{“kid”:“1”,“e”:“AQAB”,“kty”:“RSA”,“alg”:“RS256”,“n”:“rXYc2Ehtb42R