Ваше описание ваших структур данных довольно плохое.Например, вы пишете: «График - это массив, и в каждом индексе может быть список int, сохраненный в этом индексе». Что ж, это почти то, что означает type graph = int list array
(фактически, в каждом индексе всегда есть список int.), поэтому ваше английское предложение не содержит никакой дополнительной информации.Было бы более полезно объяснить, что представляет каждый элемент массива.Поскольку вы говорите о графике, я думаю, что это что-то вроде a.(i)
содержит j
означает, что есть грань от i
до j
?
Однако, поскольку задание, которое вы намеревались выполнитьописывается в терминах структуры данных, я думаю, я понимаю, что вы хотите сделать.
Чтобы выполнить итерацию по массиву, у вас есть две основные возможности: написать цикл for
или использовать одну из функцийArray.iter
или Array.iteri
.Эта задача, кажется, хорошо подходит для Array.iteri
, поскольку вы просто просматриваете массив и вам нужно знать индекс.
let print_graph (g, a : state) (out : out_channel) : unit =
Array.iteri (fun i l -> …) g;;
Хорошо, теперь нам нужно знать, что делать с каждым элементом массива.Каждый элемент представляет собой список целых чисел: l
имеет тип int list
.Из вашего примера вывода вы просто хотите вывести элементы списка по порядку с пробелом между ними.Чтобы перебирать элементы списка по порядку, стандартная библиотечная функция List.iter
как раз подходит.
let print_node (l : int list) (out : out_channel) : unit =
List.iter (fun j -> print_char ' '; print_int j) l;;
Теперь вы должны иметь возможность использовать print_node
, чтобы завершить print_graph
.Вам все равно придется печатать указатель и стрелку в начале каждой строки и печатать строку только при наличии индекса.