0

我有一个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其中ba对第二个“索引”是b对第一个“索引”。所以a("aaa", "xxx") 对的第二个 "index" 是 "xxx" 并且它被定义为b("xxx", "ccc") 第一个 "index"。关于这一点,我们创建(添加)这个新对(“aaa”,“ccc”)到返回列表。

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

此致!

4

3 回答 3

4

最简单的方法是列表推导,

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

a我们将所有元素与所有元素配对,b并根据条件过滤,将各个部分的结果组合起来。

于 2012-10-28T16:39:37.323 回答
3

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

[(x, z) | (x, y1) <- a, (y2, z) <- b, y1 == y2] 
于 2012-10-28T16:38:57.740 回答
0
import Control.Applicative

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

-- or --

c = liftA2 (,) (fst $ unzip  a) (snd $ unzip b)
于 2012-10-30T11:01:30.087 回答