对列表中的元素比较

时间:2012-03-18 02:29:44

标签: list haskell

我正在Haskell中编写一个程序,该程序获取对的列表并返回带有合并坐标的对列表,如:

    [(0,2), (2,5)] returns [(0,5)]

我编写了一个我认为可行的程序,但编译器说不能将预期类型(Int,Int)与推断类型[a]匹配

    merger :: [(Int, Int)] -> [(Int, Int)]
    merger list = [[if y == u then (x,v) else (x,y) | (u,v) <- list] | (x,y) <- list]

任何帮助将不胜感激,并感谢您阅读。

1 个答案:

答案 0 :(得分:2)

由于您使用了两个嵌套列表推导,因此结果是元组[[(Int, Int)]]列表的列表,但您的类型签名声明它应该只是元组[(Int, Int)]的列表。在返回列表之前,您可能需要concat列表,或者只使用一个列表理解和两个生成器:

merger :: [(Int, Int)] -> [(Int, Int)]
merger list = [if y == u then (x,v) else (x,y) | (u,v) <- list, (x,y) <- list]

但是,这不会给出您期望的结果。听起来你想要这样的东西:

merger list = [(u, y) | (u, v) <- list, (x, y) <- list, v == x]

最后的条件确保你只处理第一个元素的第二个元素等于第二个元素的对。