2014-11-16 2 views
0

Я пытаюсь реализовать функцию MapReduce. Я должен сделать это без каких-либо параллелизма, у меня это до сих пор:MapReduce in Haskell

import Data.Map 
import Data.Char 

map_ list = toList $ fromListWith (+) [(x, 1) | x <- list] 

main_ = map_ $ getWords "test.txt" --getting error here 

prettyprint [(x, y):xs] = x ++ " : " ++ y -- trying to print out list 

-- Loads words from a text file into a list. 
getWords :: FilePath -> IO [String] 
getWords path = do contents <- readFile path 
       return ([map toLower x | x <- words contents]) --- Ambiguous occurrence `map' 

Основная задача состоит в том, чтобы использовать MapReduce, чтобы получить список слов из файла и частоты каждого нового слова.

Я не понимаю, как работает сокращение в этом случае. Я просто знаю, что я сопоставляю список с функцией, которая вычисляет частоту слов. Как его можно уменьшить?

+1

Я настоятельно рекомендую вам добавить сигнатуры типов для каждого верхнего уровня определение. Это сделает ваш код частично документированным, а компилятор будет производить более качественные ошибки. – chi

ответ

3

Просто решение ваших проблем компиляции ...

Оба Prelude и Data.Map определения функции map.

Хороший способ исправить неоднозначность квалифицировать импорт Data.Map как это:

import qualified Data.Map as M 

, а затем использовать M.map для обозначения функции в Data.Map и простой map для обозначения версии Prelude.

Проблема в main_ что getWords является IO [String], так что вам нужно, чтобы извлечь список с оператором <-, прежде чем вы можете использовать его:

main_ = do ws <- getWords 
      -- do something with ws 
      print $ map_ ws