Я попытался реализовать простой подсчет слов с помощью библиотеки Haskell Conduit:
wordcountCv2 :: IO ()
wordcountCv2 = do
hashMap <- runConduitRes $ sourceFile "input.txt"
.| decodeUtf8C
.| omapCE Data.Char.toLower
.| peekForeverE (do
word <- takeWhileCE isAlphaNum
dropCE 1
return word)
.| foldMC insertInHashMap empty
print (toList hashMap)
insertInHashMap x v = do
return (insertWith (+) v 1 x)
Проблема в том, что эта функция отлично работает с небольшими / средними входными файлами, но по мере увеличения размера файла она имеет тенденцию разбивать некоторые слова. Например, если я использую небольшой файл, содержащий в 100 раз слово «hello», результат будет: [(«hello», 100)], вместо этого, если hellos, например, 100000, результат будет: [(«hello», 99988), ( "он", 6), ( "ад", 6), ( "о", 6), ( "LLO", 6)]. Чем больше растет файл, тем больше встречаются неработающие слова. Что-то не так в моей реализации?