次の例を検討してください。
safeMapM f xs = safeMapM' xs []
where safeMapM' [] acc = return $ reverse acc
safeMapM' (x:xs) acc = do y <- f x
safeMapM' xs (y:acc)
mapM return largelist -- Causes stack space overflow on large lists
safeMapM return largelist -- Seems to work fine
mapM
大きなリストでを使用すると、safeMapM
正常に動作しているように見えますが、スタック スペース オーバーフローが発生します (GHC 7.6.1 を と共に使用-O2
)。safeMapM
しかし、Haskell の標準ライブラリに似たような関数を見つけることができませんでした。
mapM
(またはその点で)使用することはまだ良い習慣と考えられていsequence
ますか?
もしそうなら、スタックスペースオーバーフローの危険があるにもかかわらず、なぜそれが良い習慣であると考えられているのですか?
そうでない場合、どの代替案を使用することをお勧めしますか?