如何一步一步地打印出树状的价值?

时间:2017-01-22 16:59:20

标签: sml smlnj

所以我有一个数据类型:

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

和一个示例变量:

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

我希望像这样打印:

"(1, (2, 3))"

任何帮助将不胜感激!感谢。

1 个答案:

答案 0 :(得分:1)

假设这台漂亮的打印机将是pp :ex→string ,这是一个模板:

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

此模板模式与 ex 类型的每个可能值构造函数匹配。模式深入一层,因此对于您的示例值,ex1绑定到A 2ex2在调用的第一次迭代中绑定到A 3。您希望以与处理ex1ex2相同的方式递归处理ex0B (A 1, B (A 2, A 3))

对于串联字符串,您可以考虑op ^ :string×string→string String.concat :string list→string

- 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→string 。您可能想要包装此函数,因为标准ML表示负整数有点时髦:

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