gpt4 book ai didi

haskell - 理解 Reader monad

转载 作者:行者123 更新时间:2023-12-02 05:25:25 24 4
gpt4 key购买 nike

我正在阅读《PureScript 示例》,并阅读了介绍 Reader 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

看起来好像它凭空创建了一个 Reader 😐

当我阅读有关 State monad 的内容时,它与其 get 函数具有相同的概念。文字解释如下:

状态被实现为被 State monad 的数据构造函数隐藏的函数参数,因此没有显式的引用来传递。

我猜这是关键,同样的事情也发生在 Reader 上,但我不明白它是如何工作的......

当上面的例子通过runReader运行时,提供的值如何突然出现作为ask的结果? ask 的 Haskell 文档说:检索 monad 环境。但是我的困惑是从哪里?在我看来,一个值被传递给runReader,被存储在某处,并获取它 - 你调用ask...但是这没有任何意义。

虽然这个例子是 PureScript,但我猜任何懂 Haskell 的人也能回答,因此有了 Haskell 标签。

最佳答案

我目前没有 PureScript 环境,所以我会尝试从 Haskell 的角度回答,希望它有所帮助。

Reader 实际上只是函数的“包装器”,所以当你得到 Reader r r 时,您实际上只能从 r 获得读者至r ;换句话说,一个函数r -> r .

可以凭空召唤函数,因为,如果你是柏拉图主义者,我想它们总是存在的......

当您使用do时符号,你在“monad 内部”,所以上下文 r是隐式的。换句话说,您调用一个返回 r 的函数。值,以及当您使用 <- 时箭头,您只需获取该上下文即可。

关于haskell - 理解 Reader monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com