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