如何在Ocaml中打印单元? [初学者]

时间:2019-06-03 17:49:04

标签: arrays oop output ocaml

我正在尝试用ocaml编写国际象棋游戏。在我的代码中,我定义了类型,创建了一个类来存储(每块最多32个)(块,颜色,位置)数组。现在我想将我的数组打印为字符串。我创建了两种方法,一种方法是制作一个国际象棋棋盘,然后将其作为字符串放在上面,另一种方法是将其打印出来。但是,它给我错误

Error: This expression has type string list array array -> unit
       but an expression was expected of type
         ('a -> 'b, unit, string) format =
           ('a -> 'b, unit, string, string, string, string)
           CamlinternalFormatBasics.format6

我真的很困惑,因为我试图做出不同的方法,例如,将其放在字符串列表中或将其转换为字符串数组,但这也没有用。我如何打印出这个矩阵矩阵?

       method init =
       let b = Array.make_matrix 8 8 "_" 
       for i = 0 to 7 do b.(i).(1) <- ["P"] done;
       for i = 0 to 7 do b.(i).(6) <- ["p"] done;
             for i = 0 to 7 do b.(i).(2) <- ["."; "."; "."; "."; "."; "."; "."; "."] done;
             for i = 0 to 7 do b.(i).(3) <- ["."; "."; "."; "."; "."; "."; "."; "."] done;
             for i = 0 to 7 do b.(i).(4) <- ["."; "."; "."; "."; "."; "."; "."; "."] done;
             for i = 0 to 7 do b.(i).(5) <- ["."; "."; "."; "."; "."; "."; "."; "."] done;
         for i = 0 to 7 do b.(i).(0) <- ["R"; "N"; "B"; "Q"; "K"; "B"; "N"; "R"] done;
         for i = 0 to 7 do b.(i).(7) <- ["r"; "n"; "b"; "q"; "k"; "b"; "n"; "r"] done; 

            method print = Printf.sprintf self#init board

    end;;

非常感谢您提前提供帮助。

2 个答案:

答案 0 :(得分:1)

一种可能性是使用fmt库,该库在Format模块(它本身是Printf的增强版)的顶部提供组合器。无需自定义分隔符的基本打印功能将是:

let print a = Fmt.(array (array (list string))) Fmt.stdout a

很难弄清打印机的位置,因为不清楚为什么会有国际象棋列表。

不使用组合器,可以同时使用Array.iterList.iter来达到类似的结果:

let print_list l= List.iter print_string l
let print_array a = Array.iter print_list a; print_newline ()
let print_matrix m = Array.iter print_array m

答案 1 :(得分:0)

我看到了几个不同的问题。

首先,您的方法init初始化数组b,但不执行任何操作。可能是您想要返回数组b的结果。或者,您可能想将b保存在某个地方并返回一个单位值。

第二种方法print错误地使用了Printf.sprintf。函数Print.sprintf采用格式,然后采用某些值(由格式指定)。您的电话:

Printf.sprintf self#init board

不遵循此要求。首先,没有格式。其次,这些值不是Printf模块知道如何打印的类型。我不确定self#init应该返回什么,但是Printf.sprintf不能直接打印任何明显的可能性(数组或单位值)。

在您的代码片段中未定义值board,但我认为它是某种类型的数组。同样,Printf.sprintf不能直接打印。