我在阅读Purescript通过示例并介绍了读者单元的部分。示例如下:了解阅读器monad
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
对我而言,令人困惑的部分是ask
函数。签名是:
ask :: forall r. Reader r r
它看起来好像它创建了一个读者凭空
当我念叨State
单子,它与它的get
功能相同的概念。并解释如下文字:
该状态是由状态monad的数据构造函数隐藏的函数参数实现的,所以没有明确的引用来传递。
我猜这是关键,而同样的事情,与读者发生在这里,但我不明白它是如何工作...
在上面的例子中运行通过runReader
,如何提供的值是否突然显示为ask
的结果? Haskell文档ask
说:检索monad环境。但我的困惑是从哪里?我看到它的方式,价值传递到runReader
,得到存储某处,并得到它 - 你叫ask
...但这是没有意义的。
虽然示例是Purescript,但我猜猜任何Haskell识字人员也能够回答,因此Haskell标签。
'Reader a b'是'a - > b'的一个包装。所以,问问::。读者a'最终只是'forall a'类型的一个值。 a - > a',并在其周围包装。 –