Vrej
Vrej

Reputation: 70

Printing a Function After Calling (ocaml)

I am very new to ocaml! I am using the code found here: https://rosettacode.org/wiki/Cartesian_product_of_two_or_more_lists#OCaml

I have been trying to figure out how to print the result after running the product function, Thank you very much!

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 = []*)

Upvotes: 0

Views: 79

Answers (1)

Jeffrey Scofield
Jeffrey Scofield

Reputation: 66808

Your fuction product has this type:

'a list -> 'b list -> ('a * 'b) list

There is no built-in way to print out the results of this function, because the results don't have a particular type. The type of the results depends on the types of the two input lists. Since OCaml is a strongly typed language, there's no way in general to examine a type at runtime and print it differently depending on the type.

If you run your code in the toplevel (OCaml's REPL), it will write out the results for you. It uses code that's not really available to an ordinary OCaml program:

# 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')]

If you're willing to restrict yourself to lists of ints you can use this function to print a list of type (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")

If you run it in the toplevel it looks like this:

# print_ints (product [2;3] [4;5]);;
[(2, 4); (2, 5); (3, 4); (3, 5)]
- : unit = ()

Upvotes: 1

Related Questions