Örneğin aşağıdaki düşünün: safeMapM
(-O2
ile GHC 7.6.1 kullanarak) iyi iş gibi görünüyor ederken büyük listelerindeMapM/dizisi iyi uygulama örneklerini kullanıyor mu?
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
kullanma yığın boşluk taşmasına neden olur. Ancak Haskell standart kütüphanelerinde safeMapM
'a benzer bir işlev bulamadım.
mapM
(veya bu konu için sequence
) kullanmak hala iyi bir uygulama mı?
Eğer öyleyse, neden yığın boşluk taşması tehlikesine rağmen iyi uygulama olarak kabul edilir?
Eğer hangi alternatifi kullanmamanız öneriliyor?
Belki 'mapM' taşma yapmazsa daha hızlıdır çünkü tersine çevirmek zorunda değilsiniz? Ölçdün mü? –
Test etmek için kullandığınız 'Ana' modülünü gönderebilir misiniz? – jberryman
Ayrıca, '' control.Monad.State.Lazy' gibi '' gibi bir şey '100 <$> mapM id [1 ..]' ı sonlandırır. '100 <$> güvenliMapM id [1 ..]', mononun –