2013-11-20 20 views
9

Ich bin neu in OCaml und versuche, etwas OCaml-Code zu debuggen. Gibt es in OCaml eine Funktion, die der Funktion toString() in Java entspricht, mit der die meisten Objekte als Ausgabe ausgegeben werden können?toString() entspricht in OCaml

+0

es sich um eine Achilles-Füße von OCaml hat. Die Antwort wird wahrscheinlich davon abhängen, ob Sie * Core * oder * Batteries * verwenden. – lukstafi

Antwort

9

Es gibt Funktionen wie string_of_int, string_of_float, string_of_bool im Pervasives-Modul (Sie müssen das Pervasives-Modul nicht öffnen, weil es ... weit verbreitet ist).

Alternativ können Sie Printf für diese Art der Ausgabe verwenden. Zum Beispiel:

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 

Es gibt auch eine Funktion sprintf in dem Printf-Modul, wenn Sie also einen String statt Druck nur schaffen wollten ersetzen Sie könnten nach stdout der letzten Zeile mit:

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

für komplexere Datentypen Ihrer eigenen Definition, können Sie die Erweiterung Deriving verwenden, so dass Sie keine eigenen Pretty-Druckerfunktionen für Ihren Typ definieren müssen.

+2

Sexplib-Bibliothek kann auch nützlich sein. – Kakadu

4

Wenn Sie Core und die zugehörige Sexplib-Syntax-Erweiterung verwenden, gibt es dafür ziemlich gute Lösungen. Im Wesentlichen generiert sexplib Konvertierer von OCaml-Typen zu und von s-expressions, wodurch ein praktisches Serialisierungsformat bereitgestellt wird.

Hier ist ein Beispiel mit Core und Utop. Stellen Sie sicher, befolgen Sie die folgenden Anweisungen für das Erhalten selbst einrichten Kern verwenden: 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))))" 

Sie können auch sexp-Wandler für un-named-Typen, mit der folgenden Inline-Zitat Syntax generieren.

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

Weitere Einzelheiten finden Sie hier: https://realworldocaml.org/v1/en/html/data-serialization-with-s-expressions.html