问题标签 [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.
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 myseq
'dbar
function fails to run. Update: This issue goes away if I add-fno-full-laziness
.
haskell - 用 Operational Monad 实现的 Writer 不能懒惰地工作
我使用 Operational Monad 方法编写了一个具有 Writer 功能的 monad。然后我注意到它不能懒惰地工作。
在下面的代码中,有一个rogueWriter
执行无限多个语句的语句,每个语句都写入一个字符串。程序不会终止,只需要无限输出的一些字符。
经过我的分析,我注意到流氓作家实际上非常友好(哈哈),因为当我从runMyWriter rogueWriter
变为时runWriter rogueWriter
,一切都很顺利。
问题:
- 如何最好地解释这种行为?
- 我应该如何更改我的代码以使其正常工作?
- 什么单子变压器分别
SomeMonadT
出现了同样的问题
SomeMonadT Writer w
。WriterT w SomeMonad
(也许有一些例子?)
编辑:我是否有可能在这里尝试反转无限字符串?Sjoerd Visscher 的解决方案与我的解决方案之间的显着区别是
代码:
haskell - Haskell 中 Writer Monad 的“绑定”和“返回”的官方定义在哪里?
到目前为止,我发现:
它给出了>>=
和的定义return
官方代码在哪里?
haskell - Writer monad 中的记忆
注意我只是想了解下面显示的这段特定代码中发生了什么。我知道这可能不是解决问题的最佳方法。
我正在尝试使用Writer
带有记忆斐波那契函数的惰性单子来计算函数被调用的次数。该函数快速返回正确的值,但Writer
环境永远不会返回并且不使用任何 CPU 或内存。
有人可以解释发生了什么吗?为什么环境不返回值?
编辑
无限列表[0..]
不是这里的问题。我尝试用有限的列表替换它,例如[0..10]
or[0..n]
但问题仍然存在。
如果无限列表是问题所在,那将是一个非常占用内存的计算,这就是为什么我在上面提到它不消耗任何 CPU 或内存,这让我感到困惑。
fib
我相信,由于懒惰,在评估函数的节点时会以某种方式发生死锁。
scala - 作家单子实际上与状态单子相同吗?
这里有一个很棒的教程,似乎向我暗示 Writer Monad 基本上是一个特殊情况的元组对象,它代表 (A,B) 执行操作。writer 在左侧累积值(即 A),并且 A 具有相应的 Monoid(因此它可以累积或改变状态)。如果 A 是一个集合,那么它会累积。
State Monad 也是一个处理内部元组的对象。它们都可以是 flatMap'd、map'd 等。操作对我来说似乎是一样的。它们有何不同?(请回复一个 scala 示例,我不熟悉 Haskel)。谢谢!
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 的证据。知道如何解决吗?
scala - 如何编写返回 Writer[List[Int], Int] 的函数?
假设我有一些由以下Int => Int
组成的函数andThen
:
现在我还需要返回中间结果。所以我可以将所有这些函数转换Int => (List[Int], Int)
为列表包含参数的位置。
我大概可以用Writer[List[Int], Int]
来scalaz
表示这对(List[Int], Int)
:
为了编写fw1
, fw2
,fw3
我可能需要用Kleisli
. 但是由于不是 monad Kleisli(fw1)
,因此无法编译。Writer[List[Int], Int]
我想我可能需要 amonad transformer
来制作Writer[List[Int], Int]
一个 monad,但我不知道该怎么做。所以,我的问题是:如何Kleisli(fw1)
使用 monad 转换器进行编译?
haskell - 理解 Writer Monad 的例子
我正在《Learn You A Haskell》一书中了解 Writer Monad。
这是一段代码:
运行时multWithLog
,结果如下:
在这行:
很容易看出a = 3
和b = 5
,因为它们都在return
函数上相乘。
我不明白为什么这些值是3
and 5
。不应该是包含在Monada
中的值吗?在这种情况下元组?b
Writer
例如, with this is with the Maybe
Monad,a
并且b
将是3
and 5
:
在这种情况下,这对我来说是有意义的,因为a
并b
接收里面的内容Just
。但与最初的例子相比,a
只b
收到了部分价值。
scala - scalaz - 函数组合 - WriterT
让我们定义一个Kleisli
on \/
:
和一个用于测试目的的临时功能:
函数组合工作顺利:
我想添加日志记录:
这似乎具有所需的行为:
光滑。但是,我正在努力组建一个运营商,该运营商:
- 结合
WriterT
应用中的值>>>
- 链接(附加)每个日志,跟踪所做的每个步骤
期望的输出:
我最好的镜头:
在上面我首先申请f1
,x
然后我将结果传递给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)
scala - 使用 Writer monad 验证一系列 XML 元素
这是我的老问题的后续行动。
假设我需要验证一个 XML:
我需要确保根a
有孩子a1
,,a2
和a3
(按此顺序)。
我想使用List
( 而不是scalaz.Validation
) 和Writer
monad 来收集验证错误。所以我定义了一个函数来验证一系列 XML 元素,如下所示:
现在我可以添加一个函数来验证 XML 元素的标签:
如果我重新定义Validate
,Kleisli
我将能够用以下方式组合Validate
函数andThen
:
这有意义吗?您将如何纠正/简化它?