Ocaml:两个列表的等价性

时间:2018-04-07 20:04:00

标签: functional-programming ocaml

Ocaml的新手并且一直致力于解决我尚未见到的问题。 我正在处理一个函数,其中有一个2个列表的元组,它们被检查是否等价。 例如:

str = "MAINT: Refactor something
STRY-1: Add something
STRY-2: Update something"

p str.lines.none?{|line| line.split[1].end_with?("ed", "ing")}
# => true

我的代码:

# equivalence ([1;2],[1;2]);;
- : bool = true
# equivalence ([1;2],[2;1]);;
- : bool = true
# equivalence ([1;2],[1]);;
- : bool = false

我知道问题在于最后一行。如果所有元素的顺序相同,我可以得到true的结果,但是它是乱序的结果。我无法浏览一个列表以查看其他列表是否包含该元素。我试图使用List.nth,.hd和.tl(不允许使用.map或.itr)并且还试图避免Ocaml的必要功能。我应该看看有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:0)

我认为这是一些功课,你必须将列表视为可怜的勒芒。

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

假设列表被修改为没有重复条目的集合,则a和b的等价意味着a包含b的每个元素,b包含a的每个元素。

首先编写一个函数contains: 'a -> 'a list -> bool,检查项目是否在列表中。接下来使用包含的函数contains_all: 'a list -> 'a list -> bool来检查第一个列表中的每个项目是否在第二个列表中。然后给你

let equivalence a b = (contains_all a b) && (contains_all b a)

如果您的列表可以包含重复项,那么请先排序列表。其他任何事都太不切实际了。

注意:contains如果允许您使用List.mem,则T存在。