我有一个函数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")]
c
由a
和b
组成,其中每个a
对第二个“索引”为b
对,首先是“索引”。
所以a
(“aaa”,“xxx”)对的第二个“索引”是“xxx”,它定义为b
(“xxx”,“ccc”)第一个“索引”。关于我们创建(添加)这个新对(“aaa”,“ccc”)到返回列表。
问题是如何在Haskell中做到这一点? :)
祝你好运!
答案 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)