一个人如何严格地折叠一个单子? Data.Foldable
有严格foldl'
的和一元的foldlM
,但没有严格的foldlM'
?单子本身是否以某种方式定义了严格性?如果是这样,如何确定它是什么?
想象一下,我必须确定大量环元素的乘积是否为零,但我的环不是整数域,即它包含零除数。在这种情况下,我应该递归地foldl
将我的乘法***
拖到列表上,但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
monad稍微简化此代码,foldlM
但这样做似乎缺乏所需的严格性。