ocaml—在列表中逐二迭代值

ocaml—在列表中逐二迭代值,ocaml,Ocaml,有没有一种方法可以在两个值的列表上迭代?比如: let my_list : int list = [1;2;3;4;5;6;7];; let iterate_by_two elem1 elem2 = if elem1 < elem2 then Printf.printf "True" else Printf.printf "False" in List.iter iterate_by_two my_list;; iter只接受一个参数为元素的函数。还有其他函数需要我研

有没有一种方法可以在两个值的列表上迭代?比如:

let my_list : int list = [1;2;3;4;5;6;7];;

let iterate_by_two elem1 elem2 = 
    if elem1 < elem2 then Printf.printf "True"
    else Printf.printf "False"
in List.iter iterate_by_two my_list;;
iter只接受一个参数为元素的函数。还有其他函数需要我研究吗?

您可以使用List.iter2,它用您的列表和自己的尾部并行迭代两个列表

如果列表的长度不同,它会抛出一个异常,这里就是这种情况,因为尾部明显短一个元素,但是OCaml中的异常捕获成本很低,所以这不是问题

try
  List.iter2 iterate_by_two my_list (List.tl my_list)
with Invalid_argument _ -> ()
您可以使用List.iter2,它使用您的列表和自己的尾部并行迭代两个列表

如果列表的长度不同,它会抛出一个异常,这里就是这种情况,因为尾部明显短一个元素,但是OCaml中的异常捕获成本很低,所以这不是问题

try
  List.iter2 iterate_by_two my_list (List.tl my_list)
with Invalid_argument _ -> ()

不,但写一个很容易:

let fold_left1 f lst = List.fold_left f (List.hd lst) (List.tl lst);;

let iter_pairs f lst =
  let folder left right =
    let () = f left right in
    right
  in
  ignore (fold_left1 folder lst);;

现在,您可以编写iter\u对,按两个我的列表进行迭代。

否,但编写一个很容易:

let fold_left1 f lst = List.fold_left f (List.hd lst) (List.tl lst);;

let iter_pairs f lst =
  let folder left right =
    let () = f left right in
    right
  in
  ignore (fold_left1 folder lst);;

现在,您可以编写iter\u对,按两个我的列表进行迭代。

如果您不打算使用fold或iter,那么编写您的意思可能是最简单的:

let rec iter_pairs f lst = 
  match lst with 
      [] | [_] -> ()
    | x::y::tl -> (f x y;
                   iter_pairs f (y::tl))

如果你不执意使用fold或iter,写下你的意思可能是最简单的:

let rec iter_pairs f lst = 
  match lst with 
      [] | [_] -> ()
    | x::y::tl -> (f x y;
                   iter_pairs f (y::tl))