使用自定义数据类型haskell

时间:2016-11-24 00:42:56

标签: haskell custom-data-type

我的数据类型为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))`

有人可以帮忙吗? 提前谢谢。

1 个答案:

答案 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构造函数。

这有帮助吗?