Functional programming 如何解决这个问题';两个列表的差异';功能?

Functional programming 如何解决这个问题';两个列表的差异';功能?,functional-programming,ocaml,Functional Programming,Ocaml,这个问题涉及到。我想写我自己的函数,不同于这里的函数。我使用内置的高阶函数。这是我的密码: let listdifference l1 l2= List.fold_left (fun x y ->List.filter (fun x->x!=y) l1) [] l2;; 我知道这不太好。问题是因为我在List.filter参数中有l1作为参数,因此作为输出,我得到的列表中没有第二个列表的一个元素。但我不知道如何修复它。有什么帮助吗?关于作为第一个参数传递给列表的函数。向左折叠,如果

这个问题涉及到。我想写我自己的函数,不同于这里的函数。我使用内置的高阶函数。这是我的密码:

let listdifference l1 l2=
List.fold_left (fun x y ->List.filter (fun x->x!=y) l1) [] l2;;

我知道这不太好。问题是因为我在
List.filter
参数中有
l1
作为参数,因此作为输出,我得到的列表中没有第二个列表的一个元素。但我不知道如何修复它。有什么帮助吗?

关于作为第一个参数传递给
列表的函数。向左折叠
,如果使用更明确的名称可能会更容易。我通常对累加器使用
acc

此外,您使用了两次变量名
x
:因此,在表达式
x中,外部变量被内部变量遮挡=y

通过简单的重命名,我们将获得与您相同的以下代码:

List.fold_left (fun acc elt_from_l2 -> List.filter (fun elt_from_l1 -> elt_from_l1 != elt_from_l2 ) l1) [] l2

这里我们可以看到,累加器从未使用过,这似乎是问题所在。

您需要用您的函数映射列表

let diffList l1 l2=
List.filter(fun x->List.fold_left(&&&)true@@List.map(fun t->t!=x)l2)l1;;
这实际上相当于:

let diffList l1 l2=
List.filter(fun x->List.for_all(fun t->t!=x)l2)l1;;
这和

let diffList l1 l2=
List.filter(乐趣x->not(List.mem x l2))l1;;

我认为它不起作用:[1;2;2;6;3;9;1;4;6][2;3]->[1;2;2;6;9;1;4;6]当然!这就是我所说的“在这里,我们可以看到,累加器从未使用过,这似乎是个问题。”您是否寻求帮助,或者只是想让某人给出一个答案,然后您可以复制/粘贴?请注意,操作员
=
是对
=
的否定,它检查物理相等性。
=
的表达式是
,我想您应该在这里使用它