问题标签 [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.
scala - Cats Writer for 表达式中的类型不匹配
我创建了一个类型
type ResultLog = Writer[List[String], Option[Double]]
我的函数process想要在Inputs 列表上工作并返回ResultLog:
Input是一个案例类:
我得到的是这些编译器错误:
我做错了什么?
更新:
阅读评论后,我更改了函数以组合双精度值,而不是按原样传递。这编译得很好:
}
haskell - 我们可以通过使 mappend 对第二个参数不严格来避免 Writer monad 中的空间泄漏吗
我最近读到了Writer/ WriterTmonad 的空间泄漏问题。如果我正确理解了这个问题,那是因为绑定运算符,即(>>=)不是尾递归:
定义WriterT和Writer:
我很好奇在第二个参数上引入惰性是否mappend会解决这个空间泄漏问题。
通过引入惰性,我的意思是类似于(++)运算符:
结果是在没有实际接触第二个参数的情况下产生的。
现在,如果我们使用m带有惰性单子绑定的单子(例如m ~ Identity,它给了我们普通的旧Writer单子),并使用mappend上面提到的,那么f a部分 ( w2) 在评估时可以保持 thunk mappend w1 w2,因此结果可以部分消耗 ( w1) 而没有实际上强制其余表达式(w2)。
我对此是否正确?Writer在这样的monad中是否避免了空间泄漏?
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 和隐藏 (>>) 运算符并添加我自己的实现后,它可以编译并正常工作。
haskell - LYAH - 在链接 Writer monad 时理解关于“tell”的评论
问题在底部以粗体显示。
LYAH 给出了将do符号与Writermonad一起使用的示例
do可以在没有符号的情况下重写定义:
到目前为止,一切都很好。
之后,本书介绍tell并编辑了 的定义multWithLog如下:
这又可以重写为:
然后这本书提出了一个对我来说似乎不清楚的观点,如果不是不准确的话:
最后一行很重要
return (a*b),因为表达式中最后一行do的结果是整个 do 表达式的结果。如果我们把tell作为最后一行,()将是这个do表达式的结果。我们会丢失乘法的结果。但是,日志将是相同的。
因此,我的第一个疑问来了:如果tell结果为(),那么代码不应该甚至不编译,因为()不能匹配预期的类型Int,也不能匹配除自身以外的任何其他类型();那么作者想告诉我们什么?为了使这种非基于意见的内容,自从本书编写以来,Haskell 中是否发生了一些变化,这使得上述引用的陈述不清楚/不准确?
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
ocaml - 如何将值提升到 monad
我正在尝试在 OCaml 中使用 Writer monad。
下面的语句有效。
但下面的声明没有。
我试过了
我在这里做错了什么?如何将值提升到 OCaml 中的 monad?