могу понять:
Мне нужно считать количество повторений слов в файле. У меня есть две функции
1)для считывания слов из файла:
getWords :: FilePath -> IO [String]
getWords path = do contents <- readFile path
return $ (words contents)
для получения частоты слов
frequency :: (Ord a) => [a] -> [(a, Int)]
frequency xs = toList (fromListWith (+) [(x, 1) | x <- xs])
Проблема в том, что хаскель вместо [String] возвращает IO [String]
И функция frequency отказывается принимать IO [String] чтобы я туда не подавал
Что мне нужно сделать чтобы она приняла IO [String]? Как я понял, сконвертировать IO [String] в ]String] по-человечески не выйдет, возможно переделать функцию frequency, но как?
еще у меня есть основная функция откуда я вызываю эти две (но она сейчас не работает)
occurs :: FilePath -> [String]
occurs path = do
frequency getWords path
Я бы советовал понять причину
wordsFrequensyInFile :: FilePath -> IO [(String, Int)] wordsFrequensyInFile path = do words <- getWords path pure (frequency words)
нифига оно работает, спасибо
тут же короче без do раза в два, не?
why use many word when few do trick даже я понимаю fmap, а я Haskell-то не знаю
ты умный, а не обычный студент уника, которому пихают хаскель
потому что return здесь - это не return из других языков. return :: a -> IO a
потому что return надо запретить и заставить использовать pure
Ды просто надо сначала читать документацию, а потом уже монады монадить, а не надеяться на знания, притянутые из других языков. Это как "ложные друзья переводчика".
Обсуждают сегодня