【发布时间】:2019-02-09 15:58:53
【问题描述】:
我是 Haskell 的初学者。我学习了如何创建阅读器和如何查询共享变量。我在 Hugs98 中查看了 Reader.hs 的源代码
instance Monad (Reader r) where
return a = Reader $ \_ -> a
m >>= k = Reader $ \r ->
runReader (k (runReader m r)) r
在这里我可以看到 (return a) 创建了一个 Reader 包装了一个接受值并返回 a 的函数
m >>= k 是我无法理解的。首先如何应用?也许两个读者绑定的例子可以帮助?
其次,实施对我来说有些模糊 我不明白将 k 应用于 (runReader m r) 的结果有什么意义?
谢谢
【问题讨论】:
-
既然 Reader 和 runReader 只是在两个同构类型之间穿梭,就假装它们不存在,这样就更容易理解了。
-
当 monad 是函数时,我仍然难以理解这种特定行为。在所有的 monad 辅导中似乎都缺少一个解释——monad 并不完全相同,例如当 k 应用于 >>= 的 Maybe monad 时,绑定 k 的结尾被喂入并给出 m b 这只是为了a Reader 与给出 m b 相同的 k 现在需要解包和包装 - 但从类型签名可以看出,当 k 与 a a 一起输入时会产生 Reader r b - 这是我们寻找的 Reader 并且应该结束绑定,如Maybe monad...