2013-11-20 17 views
9

Sono nuovo in OCaml e sto provando a eseguire il debug di un codice OCaml. Esiste qualche funzione in OCaml equivalente alla funzione toString() in Java con la quale è possibile stampare la maggior parte degli oggetti come output?toString() equivalente in OCaml

+0

E 'stato un Achille-piede di OCaml. La risposta dipenderà probabilmente dall'utilizzo di * Core * o * Batterie *. – lukstafi

risposta

9

Ci sono funzioni come string_of_int, string_of_float, string_of_bool nel modulo Pervasives (non è necessario aprire il modulo Pervasives perché è ... pervasivo).

In alternativa, è possibile utilizzare Printf per eseguire questo tipo di output. Per esempio:

let str = "bar" in 
let num = 1 in 
let flt = 3.14159 in 
Printf.printf "The string is: %s, num is: %d, float is: %f" str num flt 

C'è anche una funzione sprintf nel modulo Printf, quindi se si voleva creare solo una stringa invece di stampare su stdout si potrebbe sostituire quella ultima linea con:

let output = Printf.sprintf "The string is: %s, num is: %d, float is: %f" str num flt 

Per tipi di dati più complessi della propria definizione, è possibile utilizzare l'estensione Deriving in modo che non sia necessario definire le proprie funzioni di stampante per il proprio tipo.

+2

Anche la libreria di Sexplib può essere utile. – Kakadu

4

Se si utilizza Core e l'estensione della sintassi Sexplib associata, esistono soluzioni piuttosto buone. Essenzialmente, sexplib genera automaticamente convertitori da tipi OCaml a e da espressioni S, fornendo un comodo formato di serializzazione.

Ecco un esempio utilizzando Core e Utop. Assicurati di seguire le seguenti istruzioni per farti impostato per utilizzare Nucleo: http://realworldocaml.org/install

utop[12]> type foo = { x: int 
        ; y: string 
        ; z: (int * int) list 
        } 
      with sexp;; 

type foo = { x : int; y : string; z : (int * int) list; } 
val foo_of_sexp : Sexp.t -> foo = <fun> 
val sexp_of_foo : foo -> Sexp.t = <fun> 
utop[13]> let thing = { x = 3; y = "hello"; z = [1,1; 2,3; 4,2] } ;; 
val thing : foo = {x = 3; y = "hello"; z = [(1, 1); (2, 3); (4, 2)]} 
utop[14]> sexp_of_foo thing;; 
- : Sexp.t = ((x 3) (y hello) (z ((1 1) (2 3) (4 2)))) 
utop[15]> sexp_of_foo thing |> Sexp.to_string_hum;; 
- : string = "((x 3) (y hello) (z ((1 1) (2 3) (4 2))))" 

Si può anche generare sexp convertitori per i tipi senza nome, utilizzando la seguente sintassi citazione in linea.

utop[18]> (<:sexp_of<int * float list>> (3,[4.;5.;6.]));; 
- : Sexp.t = (3 (4 5 6)) 

Maggiori dettagli sono disponibili qui: https://realworldocaml.org/v1/en/html/data-serialization-with-s-expressions.html