Я попытался реализовать простой подсчет слов с помощью библиотеки 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 раз слово «привет», результат будет следующим: [(«привет», 100)], вместо этого, если приветствий, например, 100000, результат будет следующим: [(«привет», 99988), ("он", 6), ("ад", 6), ("о", 6), ("привет", 6)]. Чем больше файл растет, тем больше в нем неработающих слов. Что-то не так в моей реализации?
word <- takeWhileCE isAlphaNum
превращаетword
в()
. Принятое слово проталкивается вниз по течению, а не возвращается. В любом случае, это не должно быть проблемой. - person chi   schedule 14.05.2019