ocaml - 在列表中逐个迭代值

时间:2014-02-01 15:37:48

标签: 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;;

List.iter只接受一个带有一个参数的函数。还有其他功能我应该研究一下吗?

3 个答案:

答案 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