2013-11-20 17 views
9

OCaml için yeni ve bazı OCaml kodlarında hata ayıklamaya çalışıyorum. OCaml'de, nesnelerin çoğunun çıktı olarak yazdırılabildiği Java'da toString() işlevine eşdeğer bir işlev var mı?toString() eşdeğeri OCaml

+0

Bu OCaml bir Aşil-ayak olmuştur. Cevap muhtemelen * Core * veya * Piller * kullanıp kullanmadığınıza bağlı olacaktır. – lukstafi

cevap

9

Pervasives modülünde string_of_int, string_of_float, string_of_bool gibi işlevler vardır (Pervasives modülünü açmak zorunda değilsiniz, çünkü ... yaygındır).

Alternatif olarak, bu tür bir çıktı yapmak için Printf'i kullanabilirsiniz. Örneğin:

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 

Orada Printf modülünde bir sprintf işlevi de, bu yüzden sadece stdout'a yerine baskı bir dizi yaratmak istedik eğer o son satırı yerine olabilir:

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

için Kendi tanımlamanız için daha karmaşık veri türleri, Deriving uzantısını kullanabilirsiniz, böylece türünüz için kendi güzel yazıcı işlevlerinizi tanımlamanız gerekmez.

+2

Sexplib kitaplığı da yararlı olabilir. – Kakadu

4

Core ve ilişkili Sexplib sözdizimi uzantısını kullanırsanız, bunun için oldukça iyi çözümler vardır. Esas olarak, sexplib, OCaml tiplerinden s-ifadelerine ve uygun bir serileştirme formatı sağlayan dönüştürücüleri otomatik olarak üretir.

Core ve Utop kullanarak bir örnek. Emin kendinizi Core'u kullanmak üzere ayarlanmış almak için aşağıdaki yönergeleri izleyin olun: 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))))" 

Ayrıca aşağıdaki satır içi tırnak sözdizimi kullanılarak, un adlandırılmış türleri için sexp-dönüştürücüleri oluşturabilir.

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

Daha detay için mevcuttur: https://realworldocaml.org/v1/en/html/data-serialization-with-s-expressions.html