我在我的作业中遇到了麻烦。
写一个递归函数,构建一个集合。 mkSet :: Eq a => [a] -> Set a
其中一个提示是我应该使用另一个名为isElement的函数来检查重复的值。下面是我对isElement的代码:
我应该做些什么呢?谢谢!
写一个递归函数,构建一个集合。 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
返回的值都是一个布尔值(我不确定自己做错了什么)。
这是我目前为我的mkSet
所写的代码(请记住我刚开始学习Haskell)。
mkSet :: Eq a => [a] -> Set a
mkSet x [] = isElement x (xs)
我应该做些什么呢?谢谢!
Set
是如何定义的?您是使用Data.Set
中的那个(通过import Data.Set
)还是在代码中有一个data Set a = ...
的定义? - rampionEq a => a -> Set a -> Set a
的insert
函数;它将使用isElement
来决定要执行什么操作。然后看看是否可以利用insert
函数定义mkSet
函数。 - GS - Apologise to Monicaif x == y then True else isElement x xs
可以更简洁地写成x == y || isElement x xs
。如果递归实现isElement
不是问题要求的一部分,它可以被写成isElement x xs = any (== x) xs
,甚至可以写成isElement = elem
:这个函数已经存在于 Prelude 中了。 - amalloyx 'isElement' [] = ...
看起来更好一些。对于mkSet
- 你应该取一个列表并且只保留其中的唯一元素。 - viorior