考虑以下示例:
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
就此而言)的好习惯吗?
如果是这样,为什么尽管存在堆栈空间溢出的危险,但仍将其视为良好做法?
如果不是,您建议使用哪种替代方案?