data Set a = Node a | List {
list :: [a]
}deriving(Eq,Show,Ord)
insert :: Set Integer -> Set Integer -> Bool
insert (Node itemToInsert) (List list)
|contains (List list) (Node itemToInsert) == False = List(list:(Node itemToInsert))
contains :: Set Integer -> Set Integer -> Bool
contains (List []) (Node numberToFind) = False
contains (List (x:xs)) (Node numberToFind)
|x == (Node numberToFind) = True
|otherwise = contains (List (xs)) (Node numberToFind)
感谢您的帮助!
答案 0 :(得分:7)
从你的代码中你似乎已经理解,一个集合可以看作没有重复的列表。所以让我们用一个简单的类型定义来表达它:
data Set a = Set [a]
为了确保没有重复,可以引入“智能构造函数”,这些函数在技术上不是构造函数,但是可以这样使用。
empty :: Set a
empty = Set []
我们需要另一个来创建非空集。我们来看看你的insert
函数。为什么它返回Bool
?它不应该返回一套?为什么insert
期待两套?因此,要将整数插入到一组整数中,可以使用以下类型签名:
insert :: Integer -> Set Integer -> Set Integer
实现包括两种情况:1。给定的整数不在给定的集合中,2。给定的整数在给定的集合中。
insert x (Set xs)
| not (x `elem` xs) = Set (x:xs)
| otherwise = Set xs
因为,这个问题似乎是家庭作业的一部分。我会说你应该试着弄清楚如何自己实现elem
。