编写构造集合的递归函数

时间:2014-09-18 22:34:13

标签: haskell recursion set

我遇到了一个问题。

  

编写构造集合的递归函数   
mkSet :: Eq a => [a] −> Set a

给出的提示之一是我应该使用另一个名为isElement的函数来检查重复项的每个值。以下是isElement

的内容
isElement :: Eq a => a -> [a] -> Bool
isElement x [] = False
isElement x (y:xs) = if x == y then True else isElement x xs

我倾向于得到的一个主要错误是每次调用isElement时,来自mkSet的值都会返回Bool(我不知道我在做什么)。

这就是我目前对mkSet的看法(同时请记住,我刚开始学习Haskell)

mkSet :: Eq a => [a] -> Set a
mkSet x [] = isElement x (xs)

我应该做什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,我认为你是mkSet (x:xs)而不是mkSet x [],因为你使用的是xs。

你的功能' mkSet x [] = isElement x(xs)'正在调用函数isElement,该函数在其位置返回Bool。因此,您分配给nkSet x []的内容是Bool,而不是Set a

所以你想要的是这样的:

mkSet' :: [a] -> [a]
mkSet' [] = []
mkSet' (x:[]) = [x]
mkSet' (x:xs) = if (isElement x xs) then (mkSet' xs) else (x:(mkSet' xs))

此功能为您提供包含唯一元素的列表。你唯一要知道的就是把它变成一套。