我有这个数据类型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))`有人能帮忙吗?提前谢谢。
发布于 2016-11-24 02:45:05
正如丹尼·威尔逊所指出的,您可以使用++操作符连接两个列表:
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构造函数。
这有用吗?
https://stackoverflow.com/questions/40776444
复制相似问题