Functional programming Ocaml:两个列表的等价性

Functional programming Ocaml:两个列表的等价性,functional-programming,ocaml,Functional Programming,Ocaml,刚接触Ocaml,正在解决一个我还没有看到答案的问题。 我正在处理一个函数,其中有一个由两个列表组成的元组,检查它们是否等价。 例如: 我有: let rec equivalent(a,b) = match a, b with | [], [] -> true | [], _ | _, [] -> false | c::cc, d::dd -> if c = d then equivalent(cc,dd) else false;; 我知道问题在于最后一行。如果所有元素的顺序

刚接触Ocaml,正在解决一个我还没有看到答案的问题。 我正在处理一个函数,其中有一个由两个列表组成的元组,检查它们是否等价。 例如:

我有:

let rec equivalent(a,b) = match a, b with
| [], [] -> true
| [], _
| _, [] -> false
| c::cc, d::dd -> if c = d then equivalent(cc,dd) else false;;

我知道问题在于最后一行。如果所有元素的顺序相同,我可以得到一个true的结果,但是无序则是false的结果。我在浏览一个列表以查看另一个列表是否包含该元素时遇到问题。我尝试过使用List.nth、.hd和.tl(不允许使用.map或.itr),也尝试过避免使用Ocaml的必要特性。有什么建议或地方我应该看看吗?谢谢。

我想这是一个家庭作业,你必须把名单当作穷人的一套

正如Bergi提到的性能方面,最好先对这两个列表进行排序,然后将它们与现有代码进行比较。但这可能不是你应该如何解决这个问题的

假设列表是不包含重复项的集合,那么a和b的等价性意味着a包含b的每个元素,b包含a的每个元素

首先编写一个函数
包含:“a->”一个列表->bool
,用于检查列表中是否有项目。接下来,一个函数
包含所有内容:“一个列表->一个列表->bool
,它使用contains检查第一个列表中的每个项目是否都在第二个列表中。那就给你

let equivalence a b = (contains_all a b) && (contains_all b a)
如果您的列表可能包含重复项,则首先对列表进行排序。其他任何事情都太不切实际了


注意:
包含
作为
列表存在。mem
如果允许您使用它。

您的具体要求是什么?当两个列表的顺序不同时(列表的一个重要属性),通常不认为它们是等价的。你想把它们当作一套吗?您想将它们视为多集吗?通常要求不使用任何命令功能,如嵌套let函数、使用let声明变量,以及Ocaml手册中列出的所有命令功能。我对Ocaml中的集合没有实际经验。列表是需要的,但我想我很难像对待一组人那样对待它们。基本上,不知道如何告诉每个列表如何在没有相同顺序的情况下具有相同的值。不要问答案,而是找个地方看看会有帮助。要么测试一个列表的每个值是否包含在另一个列表中(反之亦然),要么对两个列表进行排序,然后测试它们(列表)是否等价。你说你正在尝试对一个列表进行排序。它看起来是这样的:
let sorted_list=list.sort比较未排序的_list in…
如果先对列表进行排序,那么检查是否相等会容易得多。(事实上,您现有的代码看起来已经非常接近了。)
let equivalence a b = (contains_all a b) && (contains_all b a)