Подтвердить что ты не робот

Печать списка в OCaml

Я хочу сделать что-то простое:

Распечатайте список.

let a = [1;2;3;4;5]

Как распечатать этот список до стандартного вывода?

4b9b3361

Ответ 1

Вы можете сделать это с помощью простой рекурсии:

let rec print_list = function 
[] -> ()
| e::l -> print_int e ; print_string " " ; print_list l

Голова списка печатается, затем вы делаете рекурсивный вызов в хвосте списка.

Ответ 2

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

Ответ 3

print_string (String.concat " " (List.map string_of_int list))

Ответ 4

Если вопрос заключается в поиске самого быстрого способа реализации этого, например, при отладке, можно сказать, что:

  • расширенные стандартные библиотеки (например, аккумуляторы) обычно имеют некоторые дополнительные функции:

    List.print
      ~first:"[" ~sep:";" ~last:"]" (fun c x -> Printf.fprintf c "%d" x) stdout a
    
  • это маленькое расширение синтаксиса, которое я написал некоторое время назад, позволяет вам написать:

    <:print<[$!i <- a${$d:i$}{;}]>>
    
  • автоматическая генерация недоступна (из-за отсутствия информации о типе времени выполнения в представлении данных OCaml), но может быть достигнута с использованием либо генерации кода из типов, либо типов времени выполнения.

Ответ 5

Я очень поздно отвечаю, но здесь по-другому:

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")];;

Ответ 6

Я бы сделал это следующим образом:

let a = [1;2;3;4;5];;
List.iter print_int a;;

Ответ 7

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

Ответ 8

Просто решение с% 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 = ()