我的数据类型为data List x = LT [(x,[String])]
我一直在尝试创建一个向List
添加新元素的函数。
例如,使用函数add
:
add ('a', ["1","2"]) [('x',["1"])]
结果将是:
[('x',["1"]), ('a', ["1","2"])]
订单是什么并不重要。 我已经尝试了很多,但仍然不太了解。
这就是我试过的
`add:: Ord a => a -> List a -> List a
add _ (LT[]) = empty
add x (LT(y:ys))
| belongs x (LT(y:ys)) = (LT(y:ys))
| otherwise = (LT(y:ys)) ++ (LT(x))`
有人可以帮忙吗? 提前谢谢。
答案 0 :(得分:1)
正如Danny Wilson指出的那样,您可以使用++
运算符来连接两个列表:
ghci> [1,2] ++ [3,4]
[1,2,3,4]
请记住,++
的两边都需要是列表,并且您有一个列表和一个非列表,因此您需要先将其中一个列入列表。
我根据您的措辞中的一些细节猜测您是否遇到了数据构造函数问题。 List x
不采用
[('x',["1"])]
而是
LT [('x',["1"])]
这只是使用LT
构造函数“包装”的常规列表。如果要编写函数add
,则需要在此构造函数上进行模式匹配。类型List
的每个值都以“LT
:
add :: (x, [String]) -> List x -> List x
add elem (LT list) = LT (...)
(您需要自己填写...
)
当您需要访问类型的内容时,您只需要放置LT
。因此,此函数返回未修改的列表,并且不需要LT
:
doNothing :: List x -> List x
doNothing a = a
但是只要您需要知道List x
由某些内容的列表表示,您就需要使用LT
构造函数。
这有帮助吗?