如何在Ocaml中打印数据块?

如何在Ocaml中打印数据块?,ocaml,printf,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 因此,关键是将数据块打印成几行,而不是默认的一行。有人知道如何在Ocaml中实现这一点吗 多谢各位 基本上,有两种可能的方法: 累积二维输出,并使用专门的打印功能,以您希望的方式重新排列字符串 打印到具

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

  4 5             7 8
2               5 
3    : bool     6    : int
它表示,给定一个数组
a
,来自
a([2,3],[4,5])
的区域是
bool
,来自
a([5,6],[7,8])
的区域是
int

因此,关键是将数据块打印成几行,而不是默认的一行。有人知道如何在Ocaml中实现这一点吗


多谢各位

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

  • 累积二维输出,并使用专门的打印功能,以您希望的方式重新排列字符串
  • 打印到具有2D功能的介质,如终端或GUI元素(要使用终端屏幕,可以使用绑定到)
  • 第一种方法更具普遍性,在精神上仍然有效。例如:

    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
    模块中的函数生成的字符串路由

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

  • 累积二维输出,并使用专门的打印功能,以您希望的方式重新排列字符串
  • 打印到具有2D功能的介质,如终端或GUI元素(要使用终端屏幕,可以使用绑定到)
  • 第一种方法更具普遍性,在精神上仍然有效。例如:

    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
    模块中的函数生成的字符串路由

    你的问题一点也不清楚。你能给出你想写的函数的输入和输出的例子吗?你想要什么类型的?你的问题一点也不清楚。你能给出你想写的函数的输入和输出的例子吗?你想要什么类型的?