如何在Ocaml中打印数据块?

时间:2011-07-18 09:13:32

标签: ocaml printf

我想在一个终端中逐个打印一些矩形:

  4 5             7 8
2               5 
3    : bool     6    : int

代表这一点,给定一个数组a,来自a([2,3], [4,5])的区域为bool,而来自a([5,6], [7,8])的区域为int

所以关键是要打印多行数据块,而不是默认打印1行。有谁知道如何在Ocaml中实现这一点?

非常感谢!

1 个答案:

答案 0 :(得分:1)

基本上,有两种可能的方法:

  1. 累积您的二维输出并使用专门的打印功能,以您希望的方式重新排列字符串
  2. 打印到具有2D功能的媒体,如终端或GUI元素(使用终端屏幕播放,可以使用绑定到ncurses
  3. 第一种方法更具普遍性,并在精神上保持功能。例如:

    let item1 =
    ["  4 5          "
    ;"2              "
    ;"3    : bool    "
    ]
    
    let item2 =
    ["  7 8          "
    ;"5              "
    ;"6    : int     "
    ]
    
    let transpose ll =
      let rec pick_one ll =
        match ll with
          | [] -> []
          | [] :: _ -> []
          | _ ->
          let tear (reaped, rest) l =
            match l with
              | [] -> assert false
              | hd :: tl -> (hd :: reaped, tl :: rest)
           in
          let (reaped, rest) = List.fold_left tear ([], []) ll in
          (reaped :: (pick_one rest))
       in
      pick_one ll
    
    let multiline_print items =
      let by_lines = transpose items in
      let show_line line = List.iter print_string line; print_endline "" in
      List.iter show_line by_lines
    
    let _ = multiline_print [item1; item2]
    

    根据您的需要,您可以构建printf - 类似于此功能。 您需要通过“布局引擎”路由新Printf模块中的函数生成的字符串。