如何修复此 'Difference of two lists' 函数?
How to fix this 'Difference of two lists' function?
此问题与 Library function to find difference between two lists - OCaml 有关。我想写我自己的函数,与这里的不同。我使用内置的高阶函数。这是我的代码:
let listdifference l1 l2=
List.fold_left (fun x y ->List.filter (fun x->x!=y) l1) [] l2;;
我知道这不太好。问题是因为我在 List.filter
参数中有 l1
作为参数,所以作为输出,我得到一个列表,而第二个列表中只有一个元素。但我不知道如何解决它。有帮助吗?
关于您作为第一个参数传递给 List.fold_left
的函数,如果您使用更明确的名称可能会更容易。我通常使用 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 (fun x -> not (List.mem x l2)) l1;;
此问题与 Library function to find difference between two lists - OCaml 有关。我想写我自己的函数,与这里的不同。我使用内置的高阶函数。这是我的代码:
let listdifference l1 l2=
List.fold_left (fun x y ->List.filter (fun x->x!=y) l1) [] l2;;
我知道这不太好。问题是因为我在 List.filter
参数中有 l1
作为参数,所以作为输出,我得到一个列表,而第二个列表中只有一个元素。但我不知道如何解决它。有帮助吗?
关于您作为第一个参数传递给 List.fold_left
的函数,如果您使用更明确的名称可能会更容易。我通常使用 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 (fun x -> not (List.mem x l2)) l1;;