Печать функции после вызова (ocaml) - PullRequest
0 голосов
/ 25 января 2020

Я очень новичок в ocaml! Я использую код, найденный здесь: https://rosettacode.org/wiki/Cartesian_product_of_two_or_more_lists#OCaml

Я пытался выяснить, как напечатать результат после запуска функции продукта, большое спасибо!

open Printf

let rec product l1 l2 = (* Create a recursive function (rec) named product that has 2 parameters *)
    (*ignore (Printf.printf "Debug: %s\n" 1);*)
    match l1, l2 with
    | [], _ | _, [] -> []
    | h1::t1, h2::t2 -> (h1,h2)::(product [h1] t2)@(product t1 l2)
;;

let test =
    product [1;2] [3;4];;
    ignore (Printf.printf "test: %d*" 1);
(*- : (int * int) list = [(1, 3); (1, 4); (2, 3); (2, 4)]*)
product [3;4] [1;2];;
(*- : (int * int) list = [(3, 1); (3, 2); (4, 1); (4, 2)]*)
product [1;2] [];;
(*- : (int * 'a) list = []*)
product [] [1;2];;
(*- : ('a * int) list = []*)

1 Ответ

1 голос
/ 25 января 2020

Ваша функция 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 = ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...