问题标签 [reader-monad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5357 浏览

scala - Scala 中的配置数据——我应该使用 Reader monad 吗?

如何在 Scala 中创建功能正确的可配置对象?我在Readermonad 上看过 Tony Morris 的视频,但我仍然无法连接这些点。

我有一个硬编码的Client对象列表:

我想Client.clients在运行时确定,可以灵活地从属性文件或数据库中读取它。在 Java 世界中,我会定义一个接口,实现两种类型的源代码,并使用 DI 分配一个类变量:

这对我来说似乎是一个非常干净的解决方案(代码不多,意图明确),但这var 确实跳出来了(OTOH,在我看来这并不麻烦,因为我知道它只会注入一次-一次)。

在这种情况下,monad会是什么样Reader子,像我 5 岁一样向我解释,它有什么优势?

0 投票
2 回答
361 浏览

haskell - 功能组合提示

只是在寻找以下组合如何工作的解释:

在哪里

最终类型:

我无法理解如何将ma(a -> mb)匹配,即。如何将简单类型的返回结果应用于(=<<)期望函数类型的第一个参数?

0 投票
2 回答
142 浏览

scala - 如何使用 monad reader 在迭代器对象上仅返回函数应用程序的最新结果

我在这个“过于简单”的小例子中翻译了我的问题。目标是仅返回基于对迭代器对象的每个元素的简单函数执行的最新计算。

对于这个列表,我希望我的迭代器评估返回 '8'

我开始尝试使用 a yield,但似乎我无法计算这样的两件事:

因此,有一个解决方案是mapslice保留最新评估的元素,但在与同事讨论后,这似乎不是真正漂亮的功能代码兼容,并且有更好的方法来做到这一点(真的吗?)。

基于此,我想在列表的所有元素上迭代和计算我的函数,但只返回最新的计算。

编辑:我的例子是“过于简单化”,对不起这个错误。

实际上,等效于 myPersonallMultiply 函数等于执行可能需要当前状态或要计算的先前状态的模拟。

我的模拟器的 states 函数返回 state 的迭代器:

当您计算每个状态(我的模拟步骤 = 1 个状态)时,您需要在任何地方存储/写入结果,因此我将模拟运行封装到一个 Writer 类中,这里是一个“CSVwriter”。

1 - 正如你所看到的,在这里,每一步都不需要先前的状态,但在不久的将来,情况就是这样:例如,要在我们的模拟状态 T 中计算我们的城市之间的新交换,我们需要访问在先前状态 T-1 创建的交换器

2 - 我需要返回最后一个状态来为我的模拟计算一些分数,所以我需要 CSVWriter 类写入 s.states 返回的每个状态,并返回计算的最后一个状态。

3 我认为可以为这个问题创建一个更好、更通用的解决方案:也许reader monad可以帮助我为状态迭代器的这种复杂的写入器行为创建一个更好的接口,但也许我错了?

我希望我的问题更清楚。

经过一些研究,我发现了monad reader功能模式,但是如果我在全球范围内了解这种方法的兴趣,我不明白如何翻译我在网上阅读的不同示例(就像这里的第一个示例http://mergeconflict.com /reading-your-future/)解决这个简单的问题。我此时尝试不同的代码但没有成功:/

你有一些简单的解释或指示来帮助我理解“单子阅读器”吗?

或者也许我完全错了,我无法用这种方法解决我的问题?

0 投票
3 回答
37212 浏览

haskell - 读者单子的目的是什么?

阅读器单子是如此复杂,似乎无用。如果我没记错的话,在像 Java 或 C++ 这样的命令式语言中,对于 reader monad 没有等效的概念。

你能给我一个简单的例子并澄清一下吗?

0 投票
1 回答
1289 浏览

scala - 如何避免在scala中使用Monad Transformers的阶梯?

我有以下代码使用Readermonad 进行配置并且还必须处理,IO[Option[String]]我最终得到了在我的encode函数中逐步执行的代码。

我如何制定一个 monad 转换器ReaderOptionT避免for我的函数中丑陋的嵌套理解encode

谢谢!

0 投票
2 回答
1013 浏览

clojure - 是否可以在 Clojure 中从 Haskell 中执行 Reader Monad?

我查看了algo.monadsfluokitten文档。我还阅读了Jim DueyKonrad HinsenLeonardo Borges的 monad 博客文章。

我能在 Clojure 中找到的对 Reader Monad 的唯一参考是这个 google groups Discussion

我的问题是:是否可以在 Clojure 中使用 Haskell 的 Reader Monad ?你能举个例子吗?

0 投票
2 回答
608 浏览

clojure - 阅读器 monad 和 Clojure 中的部分函数有什么区别?

Leonardo Borges对 Clojure 中的Monads进行了精彩的演示在其中,他使用以下代码描述了 Clojure 中的 reader monad :

这样做的好处是您正在以纯粹的功能方式从环境中读取值。

但是这种方法看起来非常类似于 Clojure 中的偏函数。考虑以下代码:

我的问题是:读者单子和 Clojure 中的部分函数有什么区别?

0 投票
3 回答
2756 浏览

haskell - 再来一次……我可以举一个状态单子的例子吗?

我试图了解读者和/或状态单子的实际需求。我见过的所有示例(包括许多在 stackoverflow 上的示例,因为我一直在寻找可以使用的合适示例以及在各种书籍和博客文章中)的形式(伪代码)

换句话说,调用两个函数并(大概)从一个调用到下一个调用保持某种状态。但是,我不觉得这个例子特别有说服力,因为(我认为)我可以让 f 返回一些状态,然后将该状态传递给 g。

我希望看到一个示例,使用单个整数(例如)作为要保留的状态,而不是从中心位置对 f 和 g 的两次连续调用,而是对 f 的调用,然后在内部调用 g然后在主例程中更改了可用的状态(如果是状态单子)。

我见过的大多数(实际上是所有)示例都花费大量时间关注 monad 的定义,然后展示如何设置单个函数调用。对我来说,这将是进行嵌套调用并让状态随身携带以证明它为什么有用的能力。

0 投票
1 回答
148 浏览

haskell - 使用带有 QuickCheck / monadicIO 的 Reader monad

我想将一个整数作为 CLI 参数传递给使用 QuickCheck / 的 Haskell 程序monadicIO。该整数将在内部使用assert以使测试可定制。问题是,一旦我解析 中的整数值main,我不知道如何在monadicIO调用内部传递它而不使用像IORef. 我认为一个优雅的解决方案可能是Readermonad,但我找不到让它工作的解决方案,因为quickCheck它的论点很僵化。有任何想法吗?

后来编辑1:根据要求,我附上了我正在尝试的实际代码,但失败了。注释掉的行代表我失败的尝试。背景:测试套件旨在运行一个非常简单的远程端点,该端点计算由 QuickCheck 生成的随机输入的 SHA512。远程端点是基于 Python/Flask 的。

稍后编辑 2 以响应 @user2407038:我可以propHasExpectedLengthCeiling采用 Int 类型的附加参数,但quickCheck会为其生成随机值,这不是我想要发生的。我的目标是使用maxSegmentLengthCeiling我从命令行参数中获取的,并在块let testPassed = actualMaxSegmentLength <= maxSegmentLengthCeiling内部使用它monadicIO。现在maxSegmentLengthCeiling被指定为顶级值,这意味着每次更改值时都必须重新编译代码。我还没有任何涉及的代码,IORef因为这是最后的手段,我的问题的本质是如何避免走这IORef条路。

0 投票
1 回答
448 浏览

haskell - 我知道如何使用它,但我不明白它是如何做到的(Reader monad)

考虑以下代码(省略了明显的部分)

'ask' 如何获取字符串参数?我的理解是因为类型声明

函数 'calculateContentLength' 有一个返回类型(类型为 Reader String Int),但它没有传入参数。我意识到函数本身只是传递给 runReader 函数的两个参数之一,但是 runReader 的第二个参数“s”究竟是如何与“calculateContentLength”中的“询问”相关联的?

换句话说,'calculateContentLength' 如何“知道”(并获得访问)'runReader' 传递的第二个参数?