如何严格地对单子进行折叠?
想象一下,我必须确定一个巨大的环元素列表的乘积是否为零,但我的环不是整环,即它包含零除数。在这种情况下,我应该尾递归地将我的乘法
Data.Foldable
中有严格的foldl'
和单子的foldlM
,但没有严格的foldlM'
?这种严格性是否由单子本身定义?如果是这样,那么如何确定它是什么?想象一下,我必须确定一个巨大的环元素列表的乘积是否为零,但我的环不是整环,即它包含零除数。在这种情况下,我应该尾递归地将我的乘法
***
折叠到列表中,但在乘积变为零时立即返回False
,而不是等待完整的乘积。safelist :: [p] -> Bool
safelist [] = True
safelist (x:xs) = snd $ foldl' f (x,True) xs
where f (u,b) v = (w, b && w /= Zero) where w = u *** v
也许我能使用 Maybe
函子的 foldlM
来简化这段代码,但是这样做似乎缺少必要的严格性。
>>=
在严格与懒惰方面的即兴观察:https://dev59.com/7msy5IYBdhLWcg3w4x_c#8250334 - Dan Burton(>>=)
太慵懒,foldM'
也不会有所帮助,因为强制执行由惰性State
monad 返回的值并不一定会强制执行状态。 - ehird