OCaml:打印一个长整型列表,每行 10 个元素

OCaml: Print a long int list 10 elements per row

我正在处理非常长的整数列表,需要一种将它们 10 打印到一行的方法。这是我到目前为止所得到的,现在我被卡住了:

open Printf    
let print_list list = List.iter (printf "%d ") list;;

(* Remove first n elements from list *)
let rec remove n list = 
if n== 0 then list
else match list with
| [] -> []
| hd::tl -> remove (n-1) tl;;

(* Remove and return first n elements from a list  *)
let rec take n list = 
match n with 
| 0 -> []
| _ -> List.hd list :: take (n-1) (List.tl list);;

let rec print_rows list = 
    if List.length list > 10 then
        begin
            let l = take 10 list;
            print_list l;
            print_endline " ";
            print_rows (remove 5 list)
        end else print_list list;;

我确信有更好的递归匹配模式的方法,但我想不通。求助!

这是一个函数,它的功能接近您的要求。它没有做任何花哨的事情,它只是计算到目前为止打印的整数数量并在正确的时间插入结束行。

let printby10 intlist =
    let iprint count n =
        Printf.printf "%d " n;
        if count mod 10 = 9 then Printf.printf "\n";
        count + 1
    in
    ignore (List.fold_left iprint 0 intlist)

如果整数的数量不是 10 的倍数,此代码将留下一个不完整的行。也许您需要修复它。

另一种(但非常接近@Jeffrey Scofield 的方法)方法是使用标准函数List.iteri,它提供当前元素的索引:

let print_by_rows n_per_row =
  List.iteri (fun i x ->
     print_int x;
     if (i + 1) mod n_per_row <> 0 then print_string " "
     else print_newline ())

一个测试:

μ> print_by_rows 10 (Array.to_list (Array.make 20 42));;
42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42
- : unit = ()

还有一个:

μ> print_by_rows 5 (Array.to_list (Array.make 20 42));;
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
- : unit = ()