我需要一些帮助:/
我有一个列表:
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函数的任何想法?或者任何其他解决问题的方法?
提前致谢。
答案 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)
模式匹配一个列表,其头部是一个三元素元组,并绑定该元组中的最后一个元素和列表的尾部。然后,只需重新组合列表,创建一个给定x
,y
和提取z
的新元组,然后将其添加到尾部。
答案 1 :(得分:0)
您的问题出在++
。
++
的类型为[a] -> [a] -> [a]
换句话说,它需要两个列表并“将它们放在一起”
您想要的是向a
[a]
尝试
(:) :: a -> [a] -> [a]
答案 2 :(得分:0)
您无法将newXs x y
list
与xs2
连接起来,即tuple
。