我遇到了一个问题。
编写构造集合的递归函数
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)
我应该做什么?
谢谢!
答案 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))
此功能为您提供包含唯一元素的列表。你唯一要知道的就是把它变成一套。