2013-11-20 144 views
9

我是OCaml的新手,嘗試調試一些OCaml代碼。 OCaml中是否有任何函數等價於Java中的toString()函數,通過這些函數可以將大多數對象打印爲輸出?toString()等效於OCaml

+0

它一直OCaml中的一個致命英尺。答案可能取決於您使用* Core *還是* Batteries *。 – lukstafi

回答

9

在Pervasives模塊中有函數像string_of_int,string_of_float,string_of_bool(你不必打開Pervasives模塊,因爲它是......普遍的)。

或者,您可以使用Printf來執行此類輸出。例如:

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 

另外還有printf的模塊中的sprintf函數,所以如果你想只創建一個字符串,而不是打印到標準輸出,你可以替換最後一行有:

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

對於您自己定義的更復雜的數據類型,您可以使用Deriving擴展名,這樣您就不需要爲自己的類型定義自己的漂亮打印機功能。

+2

Sexplib庫也可能有用。 – Kakadu

4

如果你使用Core和相關的Sexplib語法擴展,這裏有很好的解決方案。從本質上講,sexplib自動從OCaml類型向s表達式轉換和從s表達式轉換,提供了一種方便的序列化格式。

下面是使用Core和Utop的示例。請務必按照以下說明爲讓自己設置爲使用核心: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))))" 

您還可以生成SEXP轉換器的未命名的類型,使用下面的在線報價語法。

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

更多詳細信息,請訪問:https://realworldocaml.org/v1/en/html/data-serialization-with-s-expressions.html