haskell设置数据类型

时间:2011-11-04 03:41:34

标签: haskell

嘿大家我试图弄清楚如何在haskell中创建一个set数据类型,但我无法弄明白,这是我到目前为止,我有点困惑

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)

感谢您的帮助!

1 个答案:

答案 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