2017-01-22 74 views
0

所以我有一個數據類型:如何逐步漂亮地打印樹狀值?

datatype ex = A of int | B of ex * ex; 

和實例變量:

val x = (B (A 1, B (A 2, A 3))); 

我想通過它來打印這樣的:

"(1, (2, 3))" 

任何幫助將是不勝感激!謝謝。

+2

遞歸地思考和模式匹配。 – molbdnilo

回答

1

假設這個漂亮的打印機將是一個pp:前→字符串,這裏是一個模板:

fun pp (A i) = ... 
    | pp (B (ex1, ex2)) = ... 

此模板模式對每一個可能的值構造爲型前匹配。模式進入一級深度,因此對於您的示例值,ex1綁定到A 2ex2在第一次迭代中綁定到A 3。您想以與處理ex0的方式相同的方式遞歸處理ex1ex2,即B (A 1, B (A 2, A 3))

用於連接字符串,你可能會考慮op ^:字符串×串→字符串String.concat:字符串列表→字符串

- val test1 = "hello"^"world"; 
> val test1 = "helloworld" : string 
- val test2 = String.concat [ "if ", "you've ", "got ", "many ", "strings!" ]; 
> val test2 = "if you've got many strings!" : string 

對於漂亮的打印整數,你可以考慮Int.toString:INT →字符串。您可能想要打包此功能,因爲Standard ML呈現負整數有點時髦:

- val test3 = Int.toString ~5; 
> val test3 = "~5" : string