Как распечатать блок в Ocaml?[Начинающий] - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь написать игру в шахматы в 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 ]

1 голос
/ 03 июня 2019

Одной из возможностей является использование библиотеки 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
0 голосов
/ 03 июня 2019

Я вижу несколько разных проблем.

Во-первых, ваш метод init инициализирует массив b, но ничего с ним не делает.Возможно, вы хотели вернуть массив b в результате.Или, возможно, вы хотите сохранить b где-нибудь и вернуть значение единицы измерения.

Второй ваш метод print использует Printf.sprintf неправильно.Функция Print.sprintf принимает формат, а затем некоторые значения (как указано в формате).Ваш звонок:

Printf.sprintf self#init board

не соответствует этому требованию.Во-первых, нет формата.Во-вторых, значения отличаются от тех, которые модуль Printf умеет печатать.Я не уверен, что self#init должен возвращать, но ни одна из очевидных возможностей (массив или значение единицы) не может быть напечатана напрямую с помощью Printf.sprintf.

Значение board isn 'Это определено в вашем фрагменте кода, но я бы предположил, что это массив некоторого типа.Опять же, это не может быть напечатано напрямую Printf.sprintf.

...