【发布时间】:2020-08-31 23:43:24
【问题描述】:
阅读有关不同 monad 的 Haskell 教科书章节,当作者从解释 bind 的细节和 monad 法则跳到实际使用 monad 时,我反复迷失了方向。突然,诸如“在 monadic 上下文中运行函数”或“运行 monad”之类的表达出现了。同样,在库文档和关于 monad 转换器堆栈的讨论中,我读到一些函数“可以在任何选择的 monad 中运行”的声明。这个“在 monad 中运行”到底是什么意思?
有两件事我似乎没有弄清楚:
- monad 是一个具有函数(
return、>>=)和定律的类型类。因此,在 monad 中“运行”某些东西可能意味着 (a) 将其作为参数提供给return,或者 (b) 使用>>=对其进行排序。如果 monad 是m a类型,那么在情况 a) 中,something 必须是a类型,以匹配return函数的类型。如果 b) something 必须是a -> m b类型的函数,以匹配>>=函数的类型。由此,我不明白如何在任意 monad 中“运行”某些函数,因为我使用>>=排序的函数都必须具有相同的类型签名,并且我使用return提升的值必须是特定的 monad 类型参数。 - 据我了解,在函数式语言中没有执行或运行计算的概念 - 只有对某个参数的函数应用,并评估函数 (用它的值替换它)。然而,许多特定的 monad 带有
run函数,例如runReader、runState等。这些函数不是 monad 定义的一部分,它们是普通函数,在任何情况下都不是特殊的命令式语句语言的功能核心。那么,它们“运行”的是什么?
我觉得清楚地理解这些概念是理解 monad 转换器堆栈或类似结构的关键,这些结构似乎是理解 Haskell 中任何实质性库和任何重要程序所必需的。非常感谢您帮助我实现了从简单编写函数式代码到真正理解其含义的飞跃。
【问题讨论】:
标签: haskell monads monad-transformers purely-functional