2011-09-22 11 views
11

No puedo usar print_endline porque requiere una cadena, y no creo que tenga ninguna forma de convertir mis muy simples tipos de datos definidos por el usuario en cadenas. ¿Cómo puedo verificar los valores de las variables de estos tipos de datos?¿Hay alguna forma de imprimir tipos de datos definidos por el usuario en ocaml?

+0

http://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing – ygrek

+0

http://stackoverflow.com/questions/7380755/ocaml-get-values-type-name – ygrek

Respuesta

7

En muchos casos, no es difícil escribir su propia rutina de conversión string_of_. Esa es una alternativa simple que no requiere bibliotecas adicionales ni extensiones OCaml no estándar. Para los cursos que enseño que usan OCaml, este es a menudo el mecanismo más simple para los estudiantes.

(Sería bueno si había apoyo para una conversión genérica para cuerdas sin embargo;. Quizás el material derivado OCaml se darán cuenta)

+6

Esto es lo que he estado haciendo Por cierto, creo que en realidad estoy en tu clase. – tessr

+1

Eso pensé, según el momento de la pregunta ... :-) – stevez

8

No hay nada en el idioma base que haga esto por usted. Hay un proyecto llamado OCaml Derivación (llamado así por una característica de Haskell) que puede derivar automáticamente funciones de impresión de declaraciones de tipo. No lo he usado, pero suena excelente.

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

Una vez que tenga una función de impresión de su tipo (derivado o no), se puede instalar en el nivel superior ocaml. Esto puede ser útil, ya que la impresión integrada de alto nivel a veces no hace lo que usted desea. Para hacer esto, use la directiva #install-printer, descrita en Chapter 9 of the OCaml Manual.

3

Hay funciones de biblioteca de terceros como dump en OCaml Batteries Included o OCaml Extlib, que convertirán genéricamente cualquier valor en una cadena utilizando toda la información de tiempo de ejecución que pueda obtener. Pero esto no podrá recuperar toda la información; por ejemplo, los nombres de los constructores se pierden y se convierten solo en números enteros, por lo que no se verán exactamente como usted desea. Básicamente, tendrá que escribir sus propias funciones de conversión o utilizar alguna herramienta que las escriba por usted.

0

A lo largo de las líneas de las respuestas anteriores, ppx_sexp es un PPX para la generación de impresoras de tipo de definiciones. Aquí hay un ejemplo de cómo usarlo mientras usa jbuilder como su sistema de compilación, y usa Base y Stdio como su stdlib.

En primer lugar, el archivo jbuild que especifica cómo hacer la construcción:

(jbuild_version 1) 

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

Y aquí está el código.

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 

Y cuando lo ejecuta a obtener este resultado:

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

convertidores S-expresión están presentes en toda la base y todas las bibliotecas relacionadas (Stdio, Core_kernel, Core, asíncrono, incremental, etc.), por lo que puede contar con la posibilidad de serializar cualquier estructura de datos que encuentre allí, así como cualquier cosa que defina por su cuenta.

Cuestiones relacionadas