所以我有一个数据类型:
datatype ex = A of int | B of ex * ex;
和一个示例变量:
val x = (B (A 1, B (A 2, A 3)));
我希望像这样打印:
"(1, (2, 3))"
任何帮助将不胜感激!感谢。
答案 0 :(得分:1)
假设这台漂亮的打印机将是pp
:ex→string ,这是一个模板:
fun pp (A i) = ...
| pp (B (ex1, ex2)) = ...
此模板模式与 ex 类型的每个可能值构造函数匹配。模式深入一层,因此对于您的示例值,ex1
绑定到A 2
,ex2
在调用的第一次迭代中绑定到A 3
。您希望以与处理ex1
为ex2
相同的方式递归处理ex0
和B (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