Общеизвестно, что для чтения больших объемов данных в Хаскелле не используется [Char]
. Для этого используется ByteString
s.
Обычное объяснение этому заключается в том, что Char
s большие и списки добавляют свои накладные расходы.
Однако, похоже, что это не вызывает никаких проблем с выводом.
Например, следующая программа:
main = interact $ const $ unwords $ map show $ replicate 500000 38000000
занимает всего 131 мс на моем компьютере, в то время как следующая:
import Data.List
sum' :: [Int] -> Int
sum' = foldl' (+) 0
main = interact $ show . sum' . map read . words
занимает 3,38 секунды, если подать выход первой программы в качестве входа!
В чем причина такого несоответствия между производительностью входа и выхода с помощью Строки
s?