有没有办法迭代两个值的列表?类似的东西:
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;;
List.iter
只接受一个带有一个参数的函数。还有其他功能我应该研究一下吗?
答案 0 :(得分:2)
你可以使用List.iter2
和你的列表以及它自己的尾巴来并行迭代两个列表。
如果列表具有不同的长度,它会抛出一个异常,这就是这里的情况,因为尾部显然是一个较短的元素,但OCaml中的异常很容易捕获,因此它不是问题。
try
List.iter2 iterate_by_two my_list (List.tl my_list)
with Invalid_argument _ -> ()
答案 1 :(得分:2)
如果你不喜欢使用折叠或iter,那么写出你的意思可能最简单:
let rec iter_pairs f lst =
match lst with
[] | [_] -> ()
| x::y::tl -> (f x y;
iter_pairs f (y::tl))
答案 2 :(得分:1)
不,但写一个很容易:
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_pairs iterate_by_two my_list
。