2017-04-03 138 views
1

这可能很平凡,但我坚持写一个函数,从集合本​​身中删除集合的一个子集(找到它的补充)。
我的功能形式:从集合中删除子集

removeSubset :: (Eq a) => [a] -> [a] -> [a] 
removeSet [] ys = Just ys 
removeSet --This is where I don't know how to remove the subset 

任何帮助,因为我是新来的Haskell不胜感激。

+1

返回“Maybe [a]'而不是简单的'[a]'的目的是什么? – Franky

+0

你说得对,我应该只使用[a] –

+0

这些不是集合,它们是列表。如果你想要集合,你应该使用'Data.Set',因为它会强制实际设置条件(没有顺序,没有重复成员)并且支持更快的操作,包括'O(m * log(n/m + 1)),m <= n'设置差异。 – Lazersmoke

回答

3

您不需要在Maybe中包装结果,因为您可能总是返回空列表。

最简单的实现是:

removeSet xs ys = filter (not . (`elem` xs)) ys 

ETA后减少:

removeSet xs = filter (not.(`elem`xs)) 

更多的代码,高尔夫无点(点以下)的风格,它也可以写为:

removeSet = filter.((not.).(flip elem)) 

对于使用递归的更直接解决方案,您可能总是使用:

removeSet _ [] = [] 
removeSet [] ys = ys 
removeSet xs (y:ys)= if element y xs then removeSet xs ys else y:removeSet xs ys 
    where element x [] = False 
     element x (l:ls) = if l == x then True else element x ls 
+1

'if foo then True else bar' better better as written'foo || bar'。 – amalloy