如何实现haskell`\\`函数?

如何实现haskell`\\`函数?,haskell,lisp,set,clisp,Haskell,Lisp,Set,Clisp,在haskell中,[1,2,3,4,5,6,7]\[4,5,6]将返回[1,2,3,7]。现在我想使用clisp实现相同的函数。到目前为止,我发现设置差异有效: (set-difference '(1 2 3 4 5 6 7) '(4 5 6)) 还有其他解决方案吗?这里是haskell库源代码的相关部分。也许你可以直接翻译这些定义。我不认为它使用了任何特定于Haskell的东西 (来源于) 删除::(等式a)=>a->[a]->[a] delete=deleteBy(=) --|“dele

在haskell中,
[1,2,3,4,5,6,7]\[4,5,6]
将返回
[1,2,3,7]
。现在我想使用clisp实现相同的函数。到目前为止,我发现
设置差异
有效:

(set-difference '(1 2 3 4 5 6 7) '(4 5 6))

还有其他解决方案吗?

这里是haskell库源代码的相关部分。也许你可以直接翻译这些定义。我不认为它使用了任何特定于Haskell的东西

(来源于)

删除::(等式a)=>a->[a]->[a] delete=deleteBy(=) --|“deleteBy”函数的行为类似于“delete”,但采用 --用户提供的相等谓词。 删除人::(a->a->Bool)->a->[a]->[a] deleteBy u[]=[] deleteBy eq x(y:ys)=如果x`eq`y,则ys其他y:deleteBy eq x ys (\\):(等式a)=>[a]->[a]->[a] (\\)=foldl(翻转删除)
我对Common Lisp不太了解,下面是Ben粘贴的代码的方案实现:

(定义(差异大-小)
(折叠删除大的和小的)
(定义(删除x lst)
(以等号x lst删除)
(定义(按相等?x lst删除)
(如果(null?lst)“”)
(接收(y y y)(车辆+cdr lst)
(如果(等于x y)ys
(cons y(以等号x y()()()))删除)
其中
fold
car+cdr
来自,而
receive
来自


如果我们允许自己使用's
cut
表单,那么我们就有了一个更接近Haskell版本的解决方案(因为后者至少在两个地方使用了curry):

(定义差异(剪切-折叠-删除))
(定义删除(按相等值剪切删除?)
; 与上述版本相同
(定义(按相等?x lst删除)
(如果(null?lst)“”)
(接收(y y y)(车辆+cdr lst)
(如果(等于x y)ys
(cons y(以等号x y()()()))删除)

也许您可以解释一下使用一个名为“set difference”的函数来查找两个集合的差异有什么问题。你到底想要什么?看看这些编辑,我认为z_轴可能意味着他的
设置差异
加法可以解决他的问题。我认为克里斯·摩根的帮助可能掩盖了这一意图。我不习惯把一份清单当作一套。
delete                  :: (Eq a) => a -> [a] -> [a]
delete                  =  deleteBy (==)

-- | The 'deleteBy' function behaves like 'delete', but takes a
-- user-supplied equality predicate.
deleteBy                :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _  _ []        = []
deleteBy eq x (y:ys)    = if x `eq` y then ys else y : deleteBy eq x ys

(\\)                    :: (Eq a) => [a] -> [a] -> [a]
(\\)                    =  foldl (flip delete)