2014-05-06 105 views
1

這裏是元素的類型:如何在OCaml中使用我自己的元素類型打印列表?

type listIS=Vide | I of int*listIS |S of string*listIS ;; 

let l=I(5,I(3,S("3",I(0,S("",Vide)))));; 

我的變種:

let rec afficheIS l=match l with 
    |Vide ->"" 
    |I (i,l) -> (string_of_int i)^(afficheIS l) 
    |S (s,l) -> (s)^(afficheIS l);; 

但我怎麼能更改給我的結果:

5 3 3 0 
-:unit =() 
+0

我已經更新了我的答覆,我已經理解了問題之後。 – ivg

回答

2

我有幾個建議,關於如何改進你的代碼。

首先是美觀,對於那些閱讀代碼的人來說很重要(不適合編譯器)。請考慮在詞位之間使用空格。閱讀你的代碼會容易得多。

接下來,沒有必要把這個;;;

然後,我想提出一個更清潔的實現打印功能

open Printf 

type listIS = 
    | Vide 
    | I of int * listIS 
    | S of string * listIS 


let rec fprintIS out l = match l with 
    | Vide -> fprintf out "\n" 
    | I (i,l) -> fprintf out "%d %a" i fprintIS l 
    | S (s,l) -> fprintf out "%s %a" s fprintIS l 


let l=I(5,I(3,S("3",I(0,S("",Vide))))) 

let printIS = fprintIS stdout 
let() = printIS l 

的,我希望你熟悉printf函數。如果沒有,那麼我可以嘗試找出一些其他的解決方案,這會更容易理解。

在這個解決方案中(我已經對代碼進行了批准,正如您可能已經注意到的那樣),我使用「%a」格式說明符。它需要兩個參數:第一個是打印任意類型值的函數,第二個是該類型的值。使用說明符可以構建您的打印機。

+0

。它不會影響字符串,您嘗試從數據結構創建。 – ivg

+0

而且,你已經刪除了一條評論......儘管我會把它留給你,爲了確保你理解了你的函數產生的字符串值和解釋器的輸出之間的差異,這是爲您輸入的每個值生成的。 – ivg

+0

我試圖在評論中放置代碼,因爲我不允許在10小時後添加答案,但它沒有像代碼那樣構建,所以我編輯了我的帖子。感謝您的回覆 – Kate07

3

你的問題是在這裏: let rec afficheIS l=function你的函數afficheIS期望一個參數l(這是從未使用過的),並且你遞歸地調用afficheIS您不提供l參數。 其實這l對應於沒有,所以你應該刪除它。

+0

最初是匹配l,之後我忘記刪除參數「l」。現在我已經解決了輸出文件結尾到標準輸出設備的問題 – Kate07

1

解決:

let rec afficheIS =function 
     |Vide ->print_string "\n" 
     |I (i,l) ->(print_string (string_of_int i));(afficheIS l); 
     |S (s,l) -> print_string(s);(afficheIS l);;