列表操作

时间:2012-10-28 16:32:48

标签: haskell

我有一个函数cc声明如下(第一个参数是a(列表),第二个参数是b(列表也是如此),它应该返回第三个列表:

cc :: [(String, String)] -> [(String, String)] -> [(String, String)]
cc a b = do

示例:

a = [("aaa", "xxx"), ("bbb", "xxx")]
b = [("xxx", "ccc"), ("xxx", "ddd")]
c should be [("aaa", "ccc"), ("aaa", "ddd"), ("bbb", "ccc"), ("bbb", "ddd")]

cab组成,其中每个a对第二个“索引”为b对,首先是“索引”。 所以a(“aaa”,“xxx”)对的第二个“索引”是“xxx”,它定义为b(“xxx”,“ccc”)第一个“索引”。关于我们创建(添加)这个新对(“aaa”,“ccc”)到返回列表。

问题是如何在Haskell中做到这一点? :)

祝你好运!

3 个答案:

答案 0 :(得分:4)

最简单的方法是列表理解,

cc a b = [(u,x) | (u,v) <- a, (w,x) <- b, v == w]

我们将a的所有元素与b的所有元素配对,并根据条件进行过滤,汇总部分的结果。

答案 1 :(得分:3)

使用列表推导来从两个列表中获取对的所有组合,条件是第一对的第二个元素等于第二对的第一个元素:

[(x, z) | (x, y1) <- a, (y2, z) <- b, y1 == y2] 

答案 2 :(得分:0)

import Control.Applicative

c = (,) <$> (fst.unzip) a <*> (snd.unzip) b

-- or --

c = liftA2 (,) (fst $ unzip  a) (snd $ unzip b)