【发布时间】:2014-08-24 20:51:49
【问题描述】:
考虑以下代码(省略了明显的部分)
main = do
let s = "123456";
let len = runReader calculateContentLength s
putStrLn $ "Original 's' length: " ++ (show len)
calculateContentLength :: Reader String Int
calculateContentLength = do
content <- ask -- this seems to be the same as 'reader id'
return (length content);
“询问”如何获取字符串参数?我的理解是因为类型声明
calculateContentLength :: Reader String Int
函数“calculateContentLength”有一个返回类型(Reader String Int 类型),但它没有传入参数。我意识到该函数本身只是传递给 runReader 函数的两个参数之一,但是 runReader 的第二个参数“s”究竟是如何与“calculateContentLength”中的“询问”相关联的?
换句话说,'calculateContentLength' 如何“知道”(并获得访问)'runReader' 传递的第二个参数?
【问题讨论】:
-
顺便说一句,我确定涉及到柯里化,但我只是看不到细节。
-
我鼓励您使用
runReader和ask的源代码来证明简单的等式runReader ask s = s。然后看看你是否可以将证明用作直觉燃料。
标签: haskell monads reader-monad