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