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))