连接自定义数据类型的列表

时间:2011-11-04 14:31:51

标签: haskell

我正在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.

由于

2 个答案:

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

你想做什么(我不会太具体,因为这显然是一个练习,所以你想学习)是编写一个辅助函数来删除列表项,然后将其包装为你的设置“删除”功能。