我正在haskell中构建一个set数据类型,我正在使用remove函数,我无法正确使用,这是我的代码:
data Set a = Set [a] deriving (Eq,Ord,Show)
remove :: Integer -> Set Integer -> Set Integer
remove _ (Set []) = (Set [])
remove numberToRemove (Set (x:xs))
|x == numberToRemove = Set(xs)
|otherwise = Set(x:remove numberToRemove (Set xs))
我想将x添加到集合中,删除即将返回,但我不知道如何使用我的自定义数据类型。
这是我的错误:
test.hs:13:28:
Couldn't match expected type `[Integer]'
with actual type `Set Integer
In the return type of a call of `remove'
In the second argument of `(:)', namely
`remove numberToRemove (Set xs)'
In the first argument of `Set', namely
`(x : remove numberToRemove (Set xs))'
Failed, modules loaded: none.
由于
答案 0 :(得分:4)
使用where(或let,因为它只影响一个防护)来从Set
中提取回来的参数data Set a = Set [a] deriving (Eq,Ord,Show)
remove :: Integer -> Set Integer -> Set Integer
remove _ (Set []) = (Set [])
remove numberToRemove (Set (x:xs))
|x == numberToRemove = Set(xs)
|otherwise = Set(x:y)
where (Set y) = remove numberToRemove (Set xs)
答案 1 :(得分:3)
问题在于,您将结果从“删除”备份为一组(这是您希望它执行的操作),然后将其用作“otherwise”子句中列表的尾部。< / p>
你想做什么(我不会太具体,因为这显然是一个练习,所以你想学习)是编写一个辅助函数来删除列表项,然后将其包装为你的设置“删除”功能。