2013-11-20 10 views
9

OCamlの新機能で、OCamlコードをデバッグしようとしています。 OCamlには、JavaのtoString()関数に相当する関数があります。この関数はほとんどのオブジェクトを出力として出力できますか?OCamlのtoString()と同等

+0

それはOCamlでのアキレスフィートとなっています。答えはおそらく* Core *か* Batteries *のどちらを使うかによって決まります。 – lukstafi

答えて

9

Pervasivesモジュールにstring_of_int、string_of_float、string_of_boolなどの機能があります(普及しているためPervasivesモジュールを開く必要はありません)。

また、Printfを使用してこのような出力を行うこともできます。

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

:たとえば:あなたはちょうどあなたが持つその最後の行を置き換えることができstdoutに代わり、印刷の文字列を作成したいので、もし

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関数は、もあります独自の定義のより複雑なデータ型を使用する場合は、Derivingという拡張子を使用して、自分のタイプに適したきれいなプリンタ関数を定義する必要はありません。

+2

Sexplibライブラリも便利です。 – Kakadu

4

Coreと関連するSexplibシンタックス拡張を使用すると、これにはかなり良い解決策があります。本質的に、sexplibはOCaml型から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))))" 

また、次のインライン引用構文を使用して、名前なしのタイプのためにS式-コンバータを生成することができます。

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