一个人如何严格地折叠一个单子? 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
我也许可以使用Maybemonad稍微简化此代码,foldlM但这样做似乎缺乏所需的严格性。