gpt4 book ai didi

haskell - 全局变量和阅读器单子(monad)

转载 作者:行者123 更新时间:2023-12-03 14:24:19 31 4
gpt4 key购买 nike

我有一个 模块 通过调用初始化函数来创建和初始化全局环境(定义某些约束,例如邻居 IP 地址等)。许多后续函数在调用时应使用这些约束。

虽然原则上我理解 reader monad 的作用,但我不太确定如何将其应用于我的问题,尤其是。

  • 如何使用它来初始化由用户定义并作为数据/参数传递给初始化函数的环境。我的意思是,阅读器 monad 必须从某个地方获取构成全局不可变环境的实际值。我希望从初始化函数调用中读取值,如 myinitial :: arg1 -> arg1 -> IOString随后arg1arg2成为后续函数可通过阅读器 monad(?)
  • 访问的全局不可变数据
  • 我如何将这些环境值用作函数参数,例如recvFrom s arg1在哪里 arg1是来自我的环境的全局不可变数据。或 if arg2 > arg1 then ... else ...

  • 我当然可以制作配置文件,但我觉得配置文件会带来很大的灵 active 。

    [编辑]我了解询问,但是如果函数签名已正确定义,是否应该有额外的“类似pointfree”的方式以便可以省略全局/环境不可变?我将如何,即需要重构我的 if-then-else 以应用 this .

    最佳答案

    您的大部分问题都可以通过查看 ask 的类型和文档来回答。和 runReader职能。

    一、ask :

    ask :: Reader m r => m r

    这将返回包装在 monad 中的底层只读数据。很酷,所以当您想将它与其他功能一起使用时,这就是您将如何进入状态,在上面的示例中:
    do x <- ask
    recvFrom s x

    (当然取决于 recvFrom 的类型)

    接下来是 runReader ,这就是你给它你正在谈论的初始数据的方式。它基本上只运行 Reader使用给出的数据进行计算:
    runReader :: Reader r a -> r -> a

    这意味着:使用 r 类型的只读数据运行计算(第一个参数) (第二个论点)。它最终将返回第一个参数的结果类型, a .在您的情况下,这可能如下所示:
    result = runReader computationUsingArg1Arg2 (arg1, arg2)

    然后里面 computationUsingArg1Arg2你可以阅读 arg1arg2通过 ask .

    关于haskell - 全局变量和阅读器单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006364/

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