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
Antwort
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.
Sexplib-Bibliothek kann auch nützlich sein. – Kakadu
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
- 1. Was ist das OCaml-Idiom, das der Python-Bereichsfunktion entspricht?
- 2. ToString ("0") versus ToString (CultureInfo.InvariantCulture)
- 3. 100.toString vs 100 ['toString']
- 4. OCaml: Typ prüfen Objekte
- 5. Haskell entspricht -rectypes
- 6. OCamls set_signal entspricht in F #
- 7. Unterschied zwischen ToString ("N2") und ToString ("0.00")
- 8. Was entspricht OCamls Modulen in Haskell?
- 9. Bedingte Kompilierung in OCaml
- 10. Option String in ocaml
- 11. Datensatztyp Mustervergleich in Ocaml
- 12. umklappen Bäume in OCaml
- 13. Tail Rekursion in OCaml
- 14. Schnelle BitArray in OCaml
- 15. Was sind "" in OCaml?
- 16. Tuple in OCaml ausklappen
- 17. Schwache Polymorphie in OCaml
- 18. ignoriert Funktion in OCaml
- 19. Exception "STACK_OVERFLOW" in ocaml
- 20. Abhängige Typen in OCaml
- 21. modulare Programmierung in ocaml
- 22. Hat! = Bedeutung in OCaml?
- 23. fold_tree in OCaml
- 24. Funktoren in Ocaml
- 25. bitweise Operationen in OCaml
- 26. Reguläre Ausdrücke in OCaml
- 27. Abkürzende Konstruktornamen in Ocaml
- 28. Fehler in OCaml Datenstrukturtyp
- 29. Graphic_failure in OCaml
- 30. Factoring Produkttypzuordnungen in OCaml
es sich um eine Achilles-Füße von OCaml hat. Die Antwort wird wahrscheinlich davon abhängen, ob Sie * Core * oder * Batteries * verwenden. – lukstafi