Ocaml 如何比较列表中的每个元素?

Ocaml 如何比较列表中的每个元素?,ocaml,Ocaml,我有两个字符串列表lst1和lst2。我想通过使用List.map、List.filter等列表操作将lst1中的每个元素与lst2中的每个元素进行比较 在其他语言中,我只会使用嵌套for循环,但在OCaml中应该怎么做呢 我不知道OCaml,但您似乎在寻找比较两个数组的函数方法。在本例中,我将使用许多语言中存在的类似zip函数的东西,它创建一个新数组,其中每个元素都是一个数组,其中包含该索引处输入数组的元素。在OCaml中,这似乎是List.combine 例如,压缩[1,2,3]和[4,5,

我有两个字符串列表lst1和lst2。我想通过使用List.map、List.filter等列表操作将lst1中的每个元素与lst2中的每个元素进行比较


在其他语言中,我只会使用嵌套for循环,但在OCaml中应该怎么做呢

我不知道OCaml,但您似乎在寻找比较两个数组的函数方法。在本例中,我将使用许多语言中存在的类似zip函数的东西,它创建一个新数组,其中每个元素都是一个数组,其中包含该索引处输入数组的元素。在OCaml中,这似乎是List.combine

例如,压缩[1,2,3]和[4,5,6]会产生[[1,4]、[2,5]、[3,6]]

这允许您使用map或filter对每一对进行比较

例如,在Ruby中,我会这样做:

[1,2,3].zip([4,5,6]).map { |x,y| x > y ? x : y }

抱歉,这不是一个完整的答案,但我希望它能有所帮助。

如果保证列表长度相同,OCaml有:

List.fold_left2 (fun a e1 e2 -> a and (e1=e2)) true lst1 lst2
或者,相当于@Roma149提供的答案:

(List.combine lst1 lst2) |> (List.fold_left (fun a (e1,e2) -> a and e1=e2) true)
但当然,OCaml为每种类型定义了结构平等性,因此您可能只需要:

lst1 = lst2

OCaml有循环。但OCaml中与命令式语言中的循环相对应的惯用用法是一个高阶函数,如fold或map。您想使用哪一个取决于结果的外观。您可能希望使用嵌套映射而不是嵌套循环。注意:如果您决定使用zip,您必须记住处理两个列表长度不同的边缘情况!