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)
结果是在不实际接触第二个参数的情况下生成的
现在,如果我们使用一个带有惰性一元绑定的monadm
(例如,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和lazymappend
。我想问的是,在这种情况下,空间泄漏是否也会发生。它会泄漏。请看@ThomasM.DuBuisson,我以前读过。实际上,我是从那篇博客上了解到monads上的空间泄漏的。但是当mappend
不强制计算其第二个参数时,它没有澄清空间泄漏问题。我发现Getty的描述非常合适“请注意,为了开始评估步骤C中对mappend的调用,我们需要获得步骤A和B的输出……步骤B表示评估整个剩余计算,包括对>>=”的任意大量其他调用。即,泄漏发生在调用mappend之前。