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

Haskell 我们可以通过使mappend对第二个参数不严格来避免Writer monad中的空间泄漏吗,haskell,space-leak,writer-monad,Haskell,Space Leak,Writer Monad,我最近读到了关于Writer/WriterTmonad的空间泄漏问题。如果我正确理解了这个问题,那是因为绑定操作符,即(>>=)不是尾部递归的: m>>=f=WriterT$do (a,w1)[a] (++)[]ys=ys (++)(x:xs)ys=x:(xs++ys) 结果是在不实际接触第二个参数的情况下生成的 现在,如果我们使用一个带有惰性一元绑定的monadm(例如,m~Identity,它给了我们一个普通的老Writermonad),并使用上面提到的mappend,那么fa部分(w2)

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

m>>=f=WriterT$do
(a,w1)[a]
(++)[]ys=ys
(++)(x:xs)ys=x:(xs++ys)
结果是在不实际接触第二个参数的情况下生成的

现在,如果我们使用一个带有惰性一元绑定的monad
m
(例如,
m~Identity
,它给了我们一个普通的老
Writer
monad),并使用上面提到的
mappend
,那么
fa
部分(
w2
)在计算
mappend w2
)时仍然是一个thunk,因此,可以部分地使用结果(
w1
),而不强制使用rest表达式(
w2


我说的对吗?在这样的
Writer
monad中是否避免了空间泄漏?

Writer
只是
WriterT
具有
m~标识
,而
Writer
的空间泄漏问题经常使用列表monoid进行讨论,因此
++
映射的操作,正如您所注意到的,它在第二个参数中是惰性的。@Ben,我知道列表monoid中的
Writer w~WriterT w m
,以及
mappend=(++)
。鉴于一般的
WriterT
存在空间泄漏问题,我想知道的是,这是否也适用于简单的
Writer
monad和lazy
mappend
。我想问的是,在这种情况下,空间泄漏是否也会发生。它会泄漏。请看@ThomasM.DuBuisson,我以前读过。实际上,我是从那篇博客上了解到monads上的空间泄漏的。但是当
mappend
不强制计算其第二个参数时,它没有澄清空间泄漏问题。我发现Getty的描述非常合适“请注意,为了开始评估步骤C中对mappend的调用,我们需要获得步骤A和B的输出……步骤B表示评估整个剩余计算,包括对>>=”的任意大量其他调用。即,泄漏发生在调用mappend之前。