问题标签 [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
想要在Input
s 列表上工作并返回ResultLog
:
Input
是一个案例类:
我得到的是这些编译器错误:
我做错了什么?
更新:
阅读评论后,我更改了函数以组合双精度值,而不是按原样传递。这编译得很好:
}
haskell - 我们可以通过使 mappend 对第二个参数不严格来避免 Writer monad 中的空间泄漏吗
我最近读到了Writer
/ WriterT
monad 的空间泄漏问题。如果我正确理解了这个问题,那是因为绑定运算符,即(>>=)
不是尾递归:
定义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
符号与Writer
monad一起使用的示例
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?