2011-11-04 78 views
0

我建立在Haskell一组数据类型和我的工作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

如果您正在为乐趣这种数据类型中提取回来的说法,对你有好处!如果你只需要一个你正在编写的代码的Set数据类型,就已经有[Data.Set'](http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Set的.html) – rampion

回答

4

使用WHERE(或让尽可能它不仅影响一个后卫)从设置

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) 
3

的问题是,你是包裹从“删除”备份为一组(这是你想要它做的事)你的结果,但随后将其用作“其他”子句中列表的尾部。

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