【发布时间】:2019-02-05 13:27:05
【问题描述】:
我正在学习 Haskell 中的 monad,我了解它们为何有用,我大致了解 bind、join、return 的作用。
我还查看了基本读取器/写入器/状态/列表/可能是单子的基本用法示例。
尽管如此,作为一个初学者,我仍然不知道“运行”函数(例如 runState、runReader、runWriter)的一般含义。它似乎没有像上述函数那样的通用签名,如果它是可定义的/对所有单子都有意义,我不明白。
【问题讨论】:
-
如果你的意思是
runState、runReader等函数,那么不,这些函数并不适用于所有 monad。 -
各种
run*函数采用由>>=链接在一起的函数“链”,并返回最终按顺序计算所有函数产生的值。 -
“通用”签名可以看作是一个T-代数;获取一元值并“提取”包装代码在最终评估时产生的任何值。
>>=通常除了构建一个更大的延迟代码链之外什么都不做。 -
通常,
run*函数是无操作的,只是暴露了 monad 的内部表示。例如,Reader r a是r -> a的包装器,runReader将前者转换为后者。这同样适用于包裹(w, a)的Writer w a和包裹s -> (s, a)的State s a。在构建了一个(可能又长又复杂的)monadic 计算之后,使用run*最终让该计算与不在同一个 monad 下的程序的其余部分交互。
标签: haskell functional-programming monads