连接 - 2个列表

时间:2011-12-05 16:00:03

标签: haskell concatenation

我需要一些帮助:/

我有一个列表:

xs = [("a",1,[(11,"aa","aa"),(22,"bb","bb")]),("b",2,[(33,"cc","cc"),(44,"dd","dd")])]

我需要创建一个允许我更改“a”和1的值的函数(列表中第一个3元组的前2个值)。

我试图通过拆分我的列表来解决这个问题:

xs1 = ("a",1,[(11,"aa","aa"),(22,"bb","bb")])
xs2 = ("b",2,[(33,"cc","cc"),(44,"dd","dd")])

然后:

changeXs (_, _, z) x y = (x,y,z)
newXs x y = [changeXs xs1 x y]

这适用于更改xs1。我认为现在很容易将xs2连接到我的newXs函数,使用++ ...但它不会工作(我相信我不能使用++ whit模式匹配,我是对的吗?)

关于如何将xs2连接到newXs函数的任何想法?或者任何其他解决问题的方法?

提前致谢。

3 个答案:

答案 0 :(得分:4)

insert_new_xy x y ((_, _, z) : rest) = (x, y, z) : rest

测试:

*Main> insert_new_xy "foo" 42 xs
[("foo",42,[(11,"aa","aa"),(22,"bb","bb")]),("b",2,[(33,"cc","cc"),(44,"dd","dd")])]

((_, _, z) : rest)模式匹配一​​个列表,其头部是一个三元素元组,并绑定该元组中的最后一个元素和列表的尾部。然后,只需重新组合列表,创建一个给定xy和提取z的新元组,然后将其添加到尾部。

答案 1 :(得分:0)

您的问题出在++

++的类型为[a] -> [a] -> [a] 换句话说,它需要两个列表并“将它们放在一起”
您想要的是向a

添加一些[a]

尝试
(:) :: a -> [a] -> [a]

答案 2 :(得分:0)

您无法将newXs x y listxs2连接起来,即tuple