Я хочу сделать что-то простое:
Распечатайте список.
let a = [1;2;3;4;5]
Как распечатать этот список до стандартного вывода?
Я хочу сделать что-то простое:
Распечатайте список.
let a = [1;2;3;4;5]
Как распечатать этот список до стандартного вывода?
Вы можете сделать это с помощью простой рекурсии:
let rec print_list = function
[] -> ()
| e::l -> print_int e ; print_string " " ; print_list l
Голова списка печатается, затем вы делаете рекурсивный вызов в хвосте списка.
Вам следует ознакомиться с функциями List.iter и List.map. Они необходимы для программирования в OCaml. Если вы также получите удобство с модулем Printf, вы можете написать:
open Printf
let a = [1;2;3;4;5]
let () = List.iter (printf "%d ") a
Я открываю Printf в большинстве своих кодов, потому что часто использую функции в нем. Без этого вам придется писать Printf.printf
в последней строке. Кроме того, если вы работаете в toploop, не забудьте закончить приведенные выше инструкции двойными полуколониями.
print_string (String.concat " " (List.map string_of_int list))
Если вопрос заключается в поиске самого быстрого способа реализации этого, например, при отладке, можно сказать, что:
расширенные стандартные библиотеки (например, аккумуляторы) обычно имеют некоторые дополнительные функции:
List.print
~first:"[" ~sep:";" ~last:"]" (fun c x -> Printf.fprintf c "%d" x) stdout a
это маленькое расширение синтаксиса, которое я написал некоторое время назад, позволяет вам написать:
<:print<[$!i <- a${$d:i$}{;}]>>
Я очень поздно отвечаю, но здесь по-другому:
let print_list f lst =
let rec print_elements = function
| [] -> ()
| h::t -> f h; print_string ";"; print_elements t
in
print_string "[";
print_elements lst;
print_string "]";;
Чтобы распечатать список int, мы могли бы написать:
print_list print_int [3;6;78;5;2;34;7];;
Однако, если мы собираемся сделать это много, это сэкономит время, чтобы специализировать функцию с помощью частичного приложения:
let print_int_list = print_list print_int;;
Что мы теперь можем использовать так:
print_int_list [3;6;78;5;2;34;7];;
Что делать, если мы хотим сделать что-то довольно сложное, например, распечатать список списка int? С помощью этой функции легко:
(* Option 1 *)
print_list (print_list print_int) [[3;6;78];[];[5];[2;34;7]];;
(* Option 2 *)
let print_int_list_list = print_list (print_list print_int);;
print_int_list_list [[3;6;78];[];[5];[2;34;7]];;
(* Option 3 *)
let print_int_list_list = print_list print_int_list;;
print_int_list_list [[3;6;78];[];[5];[2;34;7]];;
Печать списка (int * string) (т.е. списка пар int и строк):
(* Option 1 *)
print_list (fun (a, b) -> print_string "("; print_int a; print_string ", "; print_string b; print_string ")") [(1, "one"); (2, "two"); (3, "three")];;
(* Option 2 *)
let print_pair f g (a, b) =
print_string "(";
f a;
print_string ", ";
g b;
print_string ")";;
print_list (print_pair print_int print_string) [(1, "one"); (2, "two"); (3, "three")];;
(* Option 3 *)
let print_pair f g (a, b) =
print_string "(";
f a;
print_string ", ";
g b;
print_string ")";;
let print_int_string_pair = print_pair print_int print_string;;
print_list print_int_string_pair [(1, "one"); (2, "two"); (3, "three")];;
(* Option 4 *)
let print_pair f g (a, b) =
print_string "(";
f a;
print_string ", ";
g b;
print_string ")";;
let print_int_string_pair = print_pair print_int print_string;;
let print_int_string_pair_list = print_list print_int_string_pair;;
print_int_string_pair_list [(1, "one"); (2, "two"); (3, "three")];;
Я бы сделал это следующим образом:
let a = [1;2;3;4;5];;
List.iter print_int a;;
let print_list l =
let rec aux acc =
match acc with
| [] -> ()
| x :: tl ->
Printf.fprintf stdout "%i"; aux tl
in aux l
или
let sprintf_list l =
let acc = ref "{" in
List.iteri (fun i x ->
acc := !acc ^
if i <> 0
then Printf.sprintf "; %i" x
else Printf.sprintf "%i" x
) l;
!acc ^ "}"
let print_list l =
let output = sprintf_list l in
Printf.fprintf stdout "%s\n" output
Просто решение с% a:
open Printf
let print_l outx l =
List.map string_of_int l
|> String.concat ";"
|> fprintf outx "%s"
Тест:
# printf "[%a]" print_l [1;2;3] ;;
[1;2;3]- : unit = ()
# printf "[%a]" print_l [];;
[]- : unit = ()