xem xét sau Ví dụ:Có sử dụng mapM/sequence được coi là thực hành tốt không?
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
Sử dụng mapM
trên các danh sách lớn gây ra một tràn không gian ngăn xếp trong khi safeMapM
dường như làm việc tốt (sử dụng GHC 7.6.1 với -O2
). Tuy nhiên tôi đã không thể tìm thấy một chức năng tương tự như safeMapM
trong các thư viện chuẩn Haskell.
Vẫn được coi là thực tiễn tốt để sử dụng mapM
(hoặc sequence
cho vấn đề đó)?
Nếu vậy, tại sao nó được coi là thực hành tốt mặc dù sự nguy hiểm của tràn không gian ngăn xếp?
Nếu bạn không đề xuất phương án thay thế nào?
Có lẽ 'mapM' nhanh hơn nếu nó không tràn vì bạn không phải' đảo ngược'? Bạn đã đo nó? –
bạn có thể đăng mô-đun 'Chính' mà bạn đã sử dụng để kiểm tra không? – jberryman
Ngoài ra, có những monads (như 'Control.Monad.State.Lazy'), nơi có một cái gì đó giống như' lấy 100 <$> mapM id [1 ..] 'chấm dứt. 'lấy 100 <$> safeMapM id [1 ..]' không thể chấm dứt, bất kể monad –