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

Если я вызываю свою программу кодирования по длине прогона с кодированием [1;1;2], я получаю

int encode list = [Multiple (1, 2); Singles 1]

Как бы получить скобку () для одиночных игр, чтобы она была похожа на [Multiple (1, 2); Одиночки (1)]?

1 ответ

Решение

Именно так OCaml печатает значения на верхнем уровне. Если конструктор данных имеет только один аргумент, он записывается без скобок.

Если вы хотите, чтобы вывод выглядел по-другому, вы должны написать свой собственный код для печати.

Вот сеанс, который показывает, как это сделать, используя #install_printer:

$ ocaml
        OCaml version 4.02.1

# type r = Singles of int | Multiple of int * int;;
type r = Singles of int | Multiple of int * int
# let printr f = function
  | Singles x -> Format.fprintf f "Singles (%d)" x
  | Multiple (x, y) -> Format.fprintf f "Multiple (%d, %d)" x y
  ;;
val printr : Format.formatter -> r -> unit = <fun>
# #install_printer printr;;
# Singles (3);;
- : r = Singles (3)
# Multiple (3, 5);;
- : r = Multiple (3, 5)
# [ Singles(1); Multiple(3, 5)];;
- : r list = [Singles (1); Multiple (3, 5)]
Другие вопросы по тегам