我对Ocaml和ML一般都是新手,我一直有一个非常根本的问题。我正在使用模式匹配,并且在一个匹配中我想打印两个或更多连接语句。例如。
nrow()
chan^"("^var^")"^op2^(poc p); chan^"("^var^")"^op^(poc p)
但是每次我运行时,打印的唯一声明是半冒号之后的最后一个。我可以帮忙解决这个问题吗?
答案 0 :(得分:2)
您的函数不会打印语句但会构建字符串,因此它会返回一个值,并且不会执行任何副作用。当分号运算符散布在两个表达式之间时,它不会合并这些表达式产生的值,因此如果您有"hello"; "world"
,则结果为"world"
。这就是你的情况下发生的事情
chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p)
电梯上的所有东西都被扔掉了。
快速解决方法是连接它们,例如,
chan^"("^var^")"^op^(poc2 p) ^ ";\n" ^ chan^"("^var^")"^op2^(poc2 p)
但一般来说,打印AST的惯用方法是使用Format
模块,并实现一个类型为pp
的递归Format.formatter -> 'a -> unit
函数。注意返回类型,该函数不构建字符串(通常是二次复杂度的操作),而是将其打印到通用输出流中。