2011-09-22 68 views
11

我不能使用print_endline,因爲它需要一個字符串,我不認爲我有任何方法將我非常簡單的用戶定義的數據類型轉換爲字符串。我如何檢查這些數據類型的變量的值?有沒有辦法在ocaml中打印用戶定義的數據類型?

+0

http://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing – ygrek

+0

http://stackoverflow.com/questions/7380755/ocaml-get-values-type-name – ygrek

回答

7

在很多情況下,編寫自己的string_of_轉換例程並不困難。這是一個簡單的選擇,不需要任何額外的庫或非標準的OCaml擴展。對於我使用OCaml教授的課程,這對學生來說通常是最簡單的機制。

(這將是很好,如果有一個通用轉換爲字符串的支持,雖然;也許OCaml中獲得的東西將捉對)

+6

This是我一直在做的事情。順便說一句,我相信我實際上在你的班上。 – tessr

+1

我是這麼認爲的,根據問題的時間... :-) – stevez

8

基本語言中沒有任何內容能爲您做到這一點。有一個名爲OCaml Deriving的項目(以Haskell的功能命名)可以自動從類型聲明中派生打印函數。我沒有用過,但聽起來很棒。

http://code.google.com/p/deriving/

一旦你有你的打印類型(衍生與否)的功能,你可以在OCaml的頂層安裝。這可以很方便,因爲內置的頂級打印有時不能完成你想要的。爲此,請使用Chapter 9 of the OCaml Manual中描述的#install-printer指令。

3

在OCaml Batteries Included或OCaml Extlib中有第三方庫函數,如dump,它將使用它可以獲得的所有運行時信息將任何值一般轉換爲字符串。但是這將無法恢復所有信息;例如,構造函數名稱會丟失併成爲整數,所以它看起來不會像你想要的那樣。你基本上必須編寫你自己的轉換函數,或者使用一些工具來爲你編寫它們。

0

除了以前的答案的線條,ppx_sexp是PPX從生成打印機類型定義。下面是如何在使用jbuilder作爲構建系統時使用它,以及使用Base和Stdio作爲stdlib的示例。

首先,jbuild文件指定該怎麼辦編譯:

(jbuild_version 1) 

(executables 
((names (w)) 
    (libraries (base stdio)) 
    (preprocess (pps (ppx_jane ppx_driver.runner))) 
)) 

而這裏的代碼。

open Base 
open Stdio 

type t = { a: int; b: float * float } 
[@@deriving sexp] 

let() = 
    let x = { a = 3; b = (4.5,5.6) } in 
    [%sexp (x : t)] |> Sexp.to_string_hum |> print_endline 

當你運行它,你會得到這樣的輸出:

((a 3) (b (4.5 5.6))) 

S-表達轉換器是目前整個基地和所有相關的庫(標準輸入輸出,CORE_KERNEL,核心,異步,增量等。 ),所以你可以指望能夠序列化你在那裏遇到的任何數據結構,以及你自己定義的任何東西。

相關問題