モナドはどのようにして1倍になりますか? Data.Foldable
は厳密なfoldl'
とモナディックfoldlM
を持っていますが、厳密なものはありませんfoldlM'
?厳密さは、モナド自体によって何とか定義されていますか?もしそうなら、どのようにしてそれがうまくいくのでしょうか?Haskellに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
を使用しますが、一見、必要な厳しさに欠けそう、このコードを簡素化することができます。
ああ、厳密なフラグがあればモナドは厳格にすることができますが、それ以外の場合はできません。そして標準的なモナドはそうしません。ありがとう! –
@JeffBurdges - ここでは、Monadicの '' = 'が厳しく対怠惰なアドホックな観測があります:http://stackoverflow.com/a/8250334/208257 –
確かに 'foldM''はあなたの '(>> =)'はあまりにも怠惰です。怠惰な 'State'モナドによって返された値を強制的に強制的に状態にするわけではありません。 – ehird