gpt4 book ai didi

haskell - 通过 monad 访问配置参数?

转载 作者:行者123 更新时间:2023-12-04 08:29:16 24 4
gpt4 key购买 nike

从这里引用:http://www.haskell.org/haskellwiki/Global_variables

If you have a global environment, which various functions read from (and you might, for example, initialise from a configuration file) then you should thread that as a parameter to your functions (after having, very likely, set it up in your 'main' action). If the explicit parameter passing annoys you, then you can 'hide' it with a Monad.



现在我正在写一些需要访问配置参数的东西,我想知道是否有人可以向我指出一个教程或任何其他资源来描述如何将 monad 用于此目的。抱歉,如果这个问题很愚蠢,我才刚刚开始摸索单子(monad)。现在阅读 Mike Vainer 的教程。

最佳答案

基本思想是您编写如下代码:

main = do
parameters <- readConfigurationParametersSomehow
forever $ do
myData <- readUserInput
putStrLn $ bigComplicatedFunction myData parameters

bigComplicatedFunction d params = someFunction params x y z
where x = function1 params d
y = function2 params x d
z = function3 params y

您使用 IO 操作读取“主”函数中的参数,然后将这些参数作为额外参数传递给您的工作函数。

这种风格的问题是必须将参数 block 传递给需要访问它的每个小函数。这是一个麻烦。您发现调用树中向下十级的某些函数现在需要一些运行时参数,并且您必须将该运行时参数作为参数添加到其间的所有函数中。这被称为 tramp data .

monad 的“解决方案”是将运行时参数嵌入到 Reader Monad 中。 ,并将您的所有功能变成一元 Action 。这摆脱了显式的 tramp 数据参数,但将其替换为 monadic 类型,并且在引擎盖下,这个 monad 实际上正在为您执行数据迁移。

命令式世界使用全局变量解决了这个问题。在 Haskell 中,你可以做同样的事情:
parameters = unsafePerformIO readConfigurationParametersSomehow

第一次使用“参数”时,“readConfigurationParametersSomehow”会被执行,从那时起,它的行为就像一个常量值,至少只要你的程序正在运行。这是 unsafePerformIO 为数不多的正确用途之一。

但是,如果您发现自己需要这样的解决方案,那么您真的需要考虑您的设计。很可能您没有足够认真地考虑将您的功能向下推广;如果某些以前的纯函数突然需要运行时参数,请查看原因,看看您是否可以以某种方式利用高阶函数。例如:
  • 传递使用参数而不是参数本身构建的函数。
  • 让底部的工作函数返回一个函数作为结果,它得到
    向上传递以与更高级别的基于参数的函数组合。
  • 重构您的调用堆栈,以便基本操作由较低级别完成
    底部的基元在顶部以参数相关的方式组成。

  • 无论哪种方式都将涉及

    关于haskell - 通过 monad 访问配置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081075/

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