Рассмотрим следующий пример:
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, если на то пошло)?
Если да, то почему это считается хорошей практикой, несмотря на опасность?
Если нет, какую альтернативу вы предлагаете использовать?