问题标签 [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 投票
1 回答
97 浏览

scala - Cats Writer for 表达式中的类型不匹配

我创建了一个类型

type ResultLog = Writer[List[String], Option[Double]]

我的函数process想要在Inputs 列表上工作并返回ResultLog

Input是一个案例类:

我得到的是这些编译器错误:

我做错了什么?

更新:

阅读评论后,我更改了函数以组合双精度值,而不是按原样传递。这编译得很好:

}

0 投票
0 回答
165 浏览

haskell - 我们可以通过使 mappend 对第二个参数不严格来避免 Writer monad 中的空间泄漏吗

我最近读到了Writer/ WriterTmonad 的空间泄漏问题。如果我正确理解了这个问题,那是因为绑定运算符,即(>>=)不是尾递归:

定义WriterTWriter

我很好奇在第二个参数上引入惰性是否mappend会解决这个空间泄漏问题。

通过引入惰性,我的​​意思是类似于(++)运算符:

结果是在没有实际接触第二个参数的情况下产生的。

现在,如果我们使用m带有惰性单子绑定的单子(例如m ~ Identity,它给了我们普通的旧Writer单子),并使用mappend上面提到的,那么f a部分 ( w2) 在评估时可以保持 thunk mappend w1 w2,因此结果可以部分消耗 ( w1) 而没有实际上强制其余表达式(w2)。

我对此是否正确?Writer在这样的monad中是否避免了空间泄漏?

0 投票
1 回答
173 浏览

haskell - 如何使用自定义数据类型定义实例 Monad Writer

我有模块:

我试图编写batchLog函数,但编译器说:

那么,为什么我需要定义其他任何 Monad。我已经instance (Monoid w) => Monad (Writer w)instance (Semigroup a, Num a) => Monoid (Foo a)instance Semigroup Integer。为什么还不够?没有batchLog功能模块编译。

GHCi,版本 8.6.5:http ://www.haskell.org/ghc/

更新: 我尝试在不使用 do 表示法的情况下进行重写,过了一段时间我可以这样做并且它编译,但仍然无法理解,为什么另一个代码使用我自己的 Monad 和 do 表示法编译:

正确的例子:

添加 RebindableSyntax 和隐藏 (>>) 运算符并添加我自己的实现后,它可以编译并正常工作。

0 投票
1 回答
90 浏览

haskell - LYAH - 在链接 Writer monad 时理解关于“tell”的评论

问题在底部以粗体显示。

LYAH 给出了将do符号与Writermonad一起使用的示例

do可以在没有符号的情况下重写定义:

到目前为止,一切都很好。

之后,本书介绍tell并编辑了 的定义multWithLog如下:

这又可以重写为:

然后这本书提出了一个对我来说似乎不清楚的观点,如果不是不准确的话:

最后一行很重要return (a*b),因为表达式中最后一行do的结果是整个 do 表达式的结果。如果我们把tell作为最后一行,()将是这个do表达式的结果。我们会丢失乘法的结果。但是,日志将是相同的。

因此,我的第一个疑问来了:如果tell结果为(),那么代码不应该甚至不编译,因为()不能匹配预期的类型Int,也不能匹配除自身以外的任何其他类型();那么作者想告诉我们什么?为了使这种非基于意见的内容,自从本书编写以来,Haskell 中是否发生了一些变化,这使得上述引用的陈述不清楚/不准确?

0 投票
2 回答
93 浏览

scala - How to fold on list of WriterT in cats

I wish to fold a list of Writer Monad from cats to one big writer without running them. for example:

I believe there must be a functional construct for such combination without running the Writers

0 投票
3 回答
116 浏览

ocaml - 如何将值提升到 monad

我正在尝试在 OCaml 中使用 Writer monad。

下面的语句有效。

但下面的声明没有。

我试过了

我在这里做错了什么?如何将值提升到 OCaml 中的 monad?