首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局变量&读取器monad

全局变量&读取器monad
EN

Stack Overflow用户
提问于 2012-06-12 23:41:51
回答 2查看 1.6K关注 0票数 5

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

虽然在原则上我理解读者的独白是什么,但我不太确定如何将它应用于我的问题,尤其是我的问题。

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

当然,我可以创建一个配置文件,但我觉得配置文件会带来很大的灵活性。

编辑我对ask的理解,但是不应该有额外的“无点的类”方式,这样如果函数签名已经定义好了,就可以省略全局/环境不变的内容了吗?我将如何,即需要重构我的如果-然后-其他应用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-13 08:17:20

这里有一个例子,可以澄清问题。首先,您需要导入Reader模块:

代码语言:javascript
复制
import Control.Monad.Reader

现在,让我们定义一些数据结构(我们将使用它来保存名称和年龄)。

代码语言:javascript
复制
data Config = Config { name :: String, age :: Int }

现在定义一个在Reader中工作的函数(它的类型是Reader Config (String, Int),但我们不需要指定它--可以推断)。这个函数所做的就是请求环境(类型为Config),然后提取字段并对它们做一些事情。

代码语言:javascript
复制
example = do
    c <- ask
    return ("Hello " ++ name c, 2 * age c)

现在我们把所有的东西放在一个程序里。do块后的前四行允许用户输入他们的姓名和年龄。然后,我们使用用户的输入构建一个Config结构(我们必须使用read将变量_age (即String )转换为一个Int,以便我们可以将它提供给Config构造函数),并使用runReader函数使用这个环境执行example。最后,我们利用这个计算结果生成一些输出。

代码语言:javascript
复制
main = do
    putStrLn "Enter your name:"
    _name <- getLine
    putStrLn "Enter your age:"
    _age <- getLine
    let config = Config _name (read _age)
    let result = runReader example config
    putStrLn $ fst result
    putStrLn $ "Twice your age is: " ++ show (snd result)
票数 4
EN

Stack Overflow用户

发布于 2012-06-13 00:29:50

大多数问题可以通过检查runReader函数的类型和文档来回答。

首先,ask

代码语言:javascript
复制
ask :: Reader m r => m r

这将返回封装在monad中的底层只读数据。酷,所以当您想要将它与其他函数一起使用时,就会这样进入状态,在上面的示例中:

代码语言:javascript
复制
do x <- ask
   recvFrom s x

(当然,这取决于recvFrom的类型)

接下来是runReader,这就是您所讨论的初始数据。它基本上只是使用给出的数据来运行Reader计算:

代码语言:javascript
复制
runReader :: Reader r a -> r -> a

这意味着:使用r类型的只读数据(第二个参数)运行计算(第一个参数)。最后,它将返回第一个参数a的结果类型。在您的例子中,这可能看起来是:

代码语言:javascript
复制
result = runReader computationUsingArg1Arg2 (arg1, arg2)

然后在computationUsingArg1Arg2内部,您可以通过ask阅读arg1arg2

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11006364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档