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