Есть ли способ печати пользовательских типов данных в ocaml? - PullRequest
15 голосов
/ 22 сентября 2011

Я не могу использовать print_endline, потому что для этого требуется строка, и я не думаю (думаю), что у меня есть какой-либо способ преобразовать мои очень простые пользовательские типы данных в строки. Как я могу проверить значения переменных этих типов данных?

Ответы [ 4 ]

13 голосов
/ 24 сентября 2011

Во многих случаях нетрудно написать собственную процедуру преобразования string_of_. Это простая альтернатива, которая не требует дополнительных библиотек или нестандартных расширений OCaml. Для курсов, которые я преподаю с использованием OCaml, это часто самый простой механизм для студентов.

(Было бы неплохо, если бы была поддержка общего преобразования в строки, хотя; возможно, материал, производный от OCaml, получит популярность.)

9 голосов
/ 22 сентября 2011

Нет ничего в базовом языке, который сделал бы это для вас.Существует проект с именем OCaml Deriving (названный в честь функции Haskell), который может автоматически выводить функции печати из объявлений типов.Я не использовал его, но звучит превосходно.

http://code.google.com/p/deriving/

Как только у вас есть функция для печати вашего типа (производная или нет), вы можете установить ее в верхней части ocaml-уровень.Это может быть удобно, поскольку встроенная печать на верхнем уровне иногда делает не совсем то, что вы хотите.Для этого используйте директиву #install-printer, описанную в главе 9 Руководства OCaml .

3 голосов
/ 23 сентября 2011

Существуют сторонние библиотечные функции, такие как dump в OCaml Batteries Included или OCaml Extlib, которые в общем случае преобразуют любое значение в строку, используя всю информацию времени выполнения, которую могут получить. Но это не сможет восстановить всю информацию; например, имена конструкторов теряются и становятся просто целыми числами, поэтому они будут выглядеть не совсем так, как вы хотите. В основном вам придется написать свои собственные функции преобразования или использовать какой-нибудь инструмент, который их напишет для вас.

1 голос
/ 19 ноября 2017

Как и в предыдущих ответах, ppx_sexp - это PPX для генерации принтеров из определений типов.Вот пример того, как использовать его при использовании jbuilder в качестве системы сборки и использовании Base и Stdio в качестве stdlib.

Во-первых, файл jbuild, который определяет, как выполнять сборку:

(jbuild_version 1)

(executables
 ((names (w))
  (libraries (base stdio))
  (preprocess (pps (ppx_jane ppx_driver.runner)))
  ))

А вот код.

open Base
open Stdio

type t = { a: int; b: float * float }
[@@deriving sexp]

let () =
  let x = { a = 3; b = (4.5,5.6) } in
  [%sexp (x : t)] |> Sexp.to_string_hum |> print_endline

И когда вы запустите его, вы получите такой вывод:

((a 3) (b (4.5 5.6)))

Преобразователи S-выражений присутствуют по всей Base и во всех связанных библиотеках (Stdio, Core_kernel, Core, Async, Incremental и т. Д.), И поэтому вы можете в значительной степени рассчитывать на возможность сериализации любой структуры данных, с которой вы сталкиваетесь, а также всего, что вы определяете самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...