【问题标题】:Haskell - Reduce list - MapReduceHaskell - 减少列表 - MapReduce
【发布时间】:2014-11-20 18:44:13
【问题描述】:

我正在尝试减少元组列表,其中重复键的值像这样添加在一起:

[(the, 1), (the, 1)] => [(the, 2)]

我试过了:

reduce :: [(String, Integer)] -> [(String, Integer)]
reduce [] = []
reduce [(k, v) : xs] = (+) [(k, v)] : reduce xs 

我收到此错误:

 Couldn't match expected type `(String, Integer)'
             with actual type `[(String, Integer)] -> [(String, Integer)]'

我做错了什么?

编辑

这是完整的程序

toTuple :: [String] -> [(String, Integer)]
toTuple [] = []
toTuple (k:xs) = (k, 1) : toTuple xs

reduce :: [(String, Integer)] -> [(String, Integer)]
reduce [] = []
reduce [(k, v) : xs] = (+) [(k, v)] : reduce xs     

main_ = do list <- getWords "test.txt"
       print $ reduce $ toTuple list

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

【问题讨论】:

  • (+) [(k, v)] 应该做什么?
  • 另外,你的主要问题是[(k, v) : xs]匹配一个包含单个元素的列表,即(k, v) : xs,你应该匹配((k, v) : xs)
  • @AdegokeA:该实现有效,但您确实会在某个地方需要 Map。您为什么要尝试更改该实施方式?
  • 您希望将什么确切传递给reduce?一对钥匙?所有键的对?
  • 您是否要合并重复键的值?重复是否保证是连续的?你在哪里检查两个键是否匹配?

标签: haskell mapreduce


【解决方案1】:

您的模式匹配错误。模式匹配应该是这样的:

  ((k,v):xs)

(k,v) 代表列表的头部,xs 代表列表的尾部。同样这是有问题的:

(+) [(k, v)] : reduce xs 

+ 的类型是这样的:

λ> :t (+)
(+) :: Num a => a -> a -> a

你不能简单地做(+) [(k, v)] : reduce xs,这在任何地方都不合理。您必须检查字符串的内容,然后添加元组的第二部分。

【讨论】:

  • @AdegokeA 如果您通过了元组列表,您期望什么?
  • 我希望得到一个元组列表但没有重复的键,而是我想要具有更新值的键。就像我在问题中给出的示例一样。
  • @AdegokeA 对于列表中的每个元素,您需要遍历列表的其余部分并检查元组的第一部分是否相等。根据检查,您必须从中创建一个新列表。
【解决方案2】:

让我指出,您的函数 reduce 与来自 Data.Map 的函数 fromListWith 极为相似:

> :m Data.Map

> let reduce = toList . fromListWith (+)

> :t reduce
reduce :: (Ord k, Num a) => [(k, a)] -> [(k, a)]

> reduce [('a', 3), ('a', 1), ('b', 2), ('a', 10), ('b', 2), ('c', 1)]
[('a',14),('b',4),('c',1)]

> reduce [(c,1) | c <- "the quick brown fox jumps over the lazy dog"]
[(' ',8),('a',1),('b',1),('c',1),('d',1),('e',3),('f',1),('g',1),('h',2),('i',1),('j',1),('k',1),('l',1),('m',1),('n',1),('o',4),('p',1),('q',1),('r',2),('s',1),('t',2),('u',2),('v',1),('w',1),('x',1),('y',1),('z',1)]

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多