问题标签 [writer-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 投票
3 回答
1592 浏览

haskell - 空间泄漏,作家和总和(哦,我的!)

我最近一直在玩 Writer Monad,我遇到了似乎是空间泄漏的问题。我不能说我完全理解这些事情,所以我想知道这里发生了什么,以及如何解决它。

首先,这是触发此错误的方法:

我得到:

为了更好地理解这一点,我在没有 Writer 或 Sum 的情况下重新实现了类似的功能,如果我保持良好和懒惰,我会得到同样的错误:

但我可以通过添加seq等式来解决这个问题:

我已经尝试seq了我的foo功能的各个部分,但这似乎没有帮助。另外,我尝试过使用Control.Monad.Writer.Strict,但这也没有什么不同。

Does Sum need to be strict somehow? Or am I missing something completely different?

Notes

  • I may have my terminology wrong here. According to Space leak zoo, my problem would be classified as a 'stack overflow', and if that's the case, how would I convert foo to a more iterative style? Is my manual recursion the problem?
  • After reading Haskell Space Overflow, I had the idea to compile with -O2, just to see what happens. This may be a topic for another question, but with optimizations, even my seq'd bar function fails to run. Update: This issue goes away if I add -fno-full-laziness.
0 投票
1 回答
192 浏览

haskell - 用 Operational Monad 实现的 Writer 不能懒惰地工作

我使用 Operational Monad 方法编写了一个具有 Writer 功能的 monad。然后我注意到它不能懒惰地工作。

在下面的代码中,有一个rogueWriter执行无限多个语句的语句,每个语句都写入一个字符串。程序不会终止,只需要无限输出的一些字符。

经过我的分析,我注意到流氓作家实际上非常友好(哈哈),因为当我从runMyWriter rogueWriter变为时runWriter rogueWriter,一切都很顺利。

问题:

  1. 如何最好地解释这种行为?
  2. 我应该如何更改我的代码以使其正常工作?
  3. 什么单子变压器分别SomeMonadT出现了同样的问题
    SomeMonadT Writer wWriterT w SomeMonad (也许有一些例子?)

编辑:我是否有可能在这里尝试反转无限字符串?Sjoerd Visscher 的解决方案与我的解决方案之间的显着区别是

代码:

0 投票
2 回答
130 浏览

haskell - Haskell 中 Writer Monad 的“绑定”和“返回”的官方定义在哪里?

到目前为止,我发现:

它给出了>>=和的定义return

官方代码在哪里?

0 投票
1 回答
176 浏览

haskell - Writer monad 中的记忆

注意我只是想了解下面显示的这段特定代码中发生了什么。我知道这可能不是解决问题的最佳方法。

我正在尝试使用Writer带有记忆斐波那契函数的惰性单子来计算函数被调用的次数。该函数快速返回正确的值,但Writer环境永远不会返回并且不使用任何 CPU 或内存。

有人可以解释发生了什么吗?为什么环境不返回值?

编辑

无限列表[0..]不是这里的问题。我尝试用有限的列表替换它,例如[0..10]or[0..n]但问题仍然存在。 如果无限列表是问题所在,那将是一个非常占用内存的计算,这就是为什么我在上面提到它不消耗任何 CPU 或内存,这让我感到困惑。

fib我相信,由于懒惰,在评估函数的节点时会以某种方式发生死锁。

0 投票
2 回答
2039 浏览

scala - 作家单子实际上与状态单子相同吗?

这里有一个很棒的教程,似乎向我暗示 Writer Monad 基本上是一个特殊情况的元组对象,它代表 (A,B) 执行操作。writer 在左侧累积值(即 A),并且 A 具有相应的 Monoid(因此它可以累积或改变状态)。如果 A 是一个集合,那么它会累积。

State Monad 也是一个处理内部元组的对象。它们都可以是 flatMap'd、map'd 等。操作对我来说似乎是一样的。它们有何不同?(请回复一个 scala 示例,我不熟悉 Haskel)。谢谢!

0 投票
1 回答
45 浏览

scala - scalar.Coyoneda.liftTF 的上下文边界

看完了 Rúnar Bjarnason 发人深省的视频“具有合理价格的 monad 的可组合应用程序架构”,我开始在 Scalaz 中编写视频中提供的示例。在为 Interact App 实现基于编写器的解释器时,我有点惊讶。这是代码,

当我试图将 ConsoleW 提升为交互自由 monad 的解释器时,编译器提示我缺少 Functor 到 W 的上下文绑定。我很惊讶,因为 Writer 本身就是一个 monad,应该免费提供 functor 上下文绑定。好的,所以我必须明确地编写一个仿函数,

这很愚蠢......因为除了调用 Writer 本身的 map 方法之外,我基本上什么也没做。现在我可以将 ConsoleW 提升为解释器。但是,当我尝试使用 ConsoleW 折叠交互程序时,编译器再次提示缺少为 W 绑定的 Monad 上下文!好吧,这完全出乎意料,让我用勺子喂你,Scalac...

现在一切都编译好了,Writer Monad 可以在程序运行时将所有提示记录到向量中。但这并不令人满意,我想创建一个以 Writer 作为底层 Monad 的解释器,而不必明确提供它确实是 Functor 和 Monad 的证据。知道如何解决吗?

0 投票
1 回答
77 浏览

scala - 如何编写返回 Writer[List[Int], Int] 的函数?

假设我有一些由以下Int => Int组成的函数andThen

现在我还需要返回中间结果。所以我可以将所有这些函数转换Int => (List[Int], Int)为列表包含参数的位置。

我大概可以用Writer[List[Int], Int]scalaz表示这对(List[Int], Int)

为了编写fw1, fw2fw3我可能需要用Kleisli. 但是由于不是 monad Kleisli(fw1),因此无法编译。Writer[List[Int], Int]

我想我可能需要 amonad transformer来制作Writer[List[Int], Int]一个 monad,但我不知道该怎么做。所以,我的问题是:如何Kleisli(fw1)使用 monad 转换器进行编译?

0 投票
3 回答
1359 浏览

haskell - 理解 Writer Monad 的例子

我正在《Learn You A Haskell》一书中了解 Writer Monad。

这是一段代码:

运行时multWithLog,结果如下:

在这行:

很容易看出a = 3b = 5,因为它们都在return函数上相乘。

我不明白为什么这些值是3and 5。不应该是包含在Monada中的值吗?在这种情况下元组?bWriter

例如, with this is with the MaybeMonad,a并且b将是3and 5

在这种情况下,这对我来说是有意义的,因为ab接收里面的内容Just。但与最初的例子相比,ab收到了部分价值。

0 投票
1 回答
164 浏览

scala - scalaz - 函数组合 - WriterT

让我们定义一个Kleislion \/

和一个用于测试目的的临时功能:

函数组合工作顺利:

我想添加日志记录:

这似乎具有所需的行为:

光滑。但是,我正在努力组建一个运营商,该运营商:

  • 结合WriterT应用中的值>>>
  • 链接(附加)每个日志,跟踪所做的每个步骤

期望的输出:

我最好的镜头:

在上面我首先申请f1x然后我将结果传递给f2。否则,我短路到Left。这是错误的,因为在这种情况下Right,我将删除以前的日志记录历史。

最后一个Q

不知道为什么在管道切换到Left. 是不是因为:

  • type MyMonad ewa = ErrorT e (Writer w) a 同构于 (Either ea, w)
  • type MyMonad ewa = WriterT w (Either e) a 同构于 Either r (a, w)

因此我翻转了订单

资料来源:herescalazherereal world haskell on transformers

0 投票
0 回答
85 浏览

scala - 使用 Writer monad 验证一系列 XML 元素

这是我的老问题的后续行动。

假设我需要验证一个 XML:

我需要确保根a有孩子a1,,a2a3(按此顺序)。

我想使用List( 而不是scalaz.Validation) 和Writermonad 来收集验证错误。所以我定义了一个函数来验证一系列 XML 元素,如下所示:

现在我可以添加一个函数来验证 XML 元素的标签:

如果我重新定义ValidateKleisli我将能够用以下方式组合Validate函数andThen

这有意义吗?您将如何纠正/简化它?