我正在尝试用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;;
非常感谢您提前提供帮助。
答案 0 :(得分:1)
一种可能性是使用fmt
库,该库在Format
模块(它本身是Printf的增强版)的顶部提供组合器。无需自定义分隔符的基本打印功能将是:
let print a = Fmt.(array (array (list string))) Fmt.stdout a
很难弄清打印机的位置,因为不清楚为什么会有国际象棋列表。
不使用组合器,可以同时使用Array.iter
和List.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
不能直接打印。