Ваша функция product
имеет такой тип:
'a list -> 'b list -> ('a * 'b) list
Нет встроенного способа распечатать результаты этой функции, потому что результаты не имеют определенного типа. Тип результатов зависит от типов двух входных списков. Поскольку OCaml является языком со строгой типизацией, в общем случае нет способа проверить тип во время выполнения и вывести его по-разному в зависимости от типа.
Если вы запустите свой код на верхнем уровне (REPL OCaml), он напишет результаты для вас. Он использует код, который на самом деле не доступен для обычной программы OCaml:
# product [1;2] [3;4];;
- : (int * int) list = [(1, 3); (1, 4); (2, 3); (2, 4)]
# product [1.; 2.] ['a'; 'b'];;
- : (float * char) list = [(1., 'a'); (1., 'b'); (2., 'a'); (2., 'b')]
Если вы хотите ограничиться списками целых чисел, вы можете использовать эту функцию для печати списка типа (int * int) list
:
let print_ints pair_list =
let pair_str (i, j) = Printf.sprintf "(%d, %d)" i j in
print_string
("[" ^ String.concat "; " (List.map pair_str pair_list) ^ "]\n")
Если запустить его на верхнем уровне, он будет выглядеть так:
# print_ints (product [2;3] [4;5]);;
[(2, 4); (2, 5); (3, 4); (3, 5)]
- : unit = ()