モナドを厳密に折りたたむにはどうすればよいですか? Data.Foldable
strictfoldl'
と monadicfoldlM
がありますが、 strict はありません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
モナドを使用してこのコードを少し単純化することもできますfoldlM
が、そうすると必要な厳密さが欠けているように見えます。