考虑以下示例:
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
Run Code Online (Sandbox Code Playgroud)
mapM在大型列表上使用会导致堆栈空间溢出,而safeMapM似乎工作正常(使用GHC 7.6.1 -O2).但是我无法找到类似于safeMapMHaskell标准库的函数.
是否仍然被认为是使用mapM(或sequence就此而言)的良好做法?
如果是这样,尽管存在堆栈空间溢出的危险,为什么它被认为是一种好的做法?
如果不是您建议使用哪种替代方案?
haskell ×1