Ocaml打印一个接一个的声明

问题描述:

我对Ocaml和ML一般都很陌生,而且我一直有一个非常根本的问题。我正在使用模式匹配,并且在一个匹配中,我想打印两个或多个连接的语句。例如。 chan^"("^var^")"^op2^(poc p); chan^"("^var^")"^op^(poc p)Ocaml打印一个接一个的声明

let processoperatorchange2 t2s2 proc2 op op2= 
    let rec poc2 p = match p with 
    | Zero -> "0" 
    | Pproc (x) -> String.lowercase x 
    | In(chan, var, _, p, _) -> chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p) 
    in poc2 proc2 

但后来我每次运行这段时间,打印的唯一的语句是分号后的最后一个。我可以得到一些帮助吗?

+0

您可以添加整个匹配表达式吗?从你的问题我可以猜测你返回一个字符串,而不是打印它。 – nefas

+0

嗨,是的,我刚刚用代码编辑了这个问题。问题是串联的字符串是不同的用户定义类型的组合,所以现在我只是打印它,但每当我分配给一个变量,它返回单位,我无法打印出来 – user1514567

您的函数不会打印语句,而会生成一个字符串,因此它会返回一个值,并且不会执行任何副作用。分号运算符分散在两个表达式之间时,不会合并这些表达式产生的值,因此如果您有"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 。请注意返回类型,函数不会构建字符串(通常是二次复杂操作),而是将其打印到通用输出流中。

+0

嗨,非常感谢指针。我将尝试Format.Formatter选项。谢谢! – user1514567

+0

你好,我有一个后续问题。假设我想在我的问题中构建这个字符串以将其添加到Set,那么最佳方法是什么?目前我正在将它打印出来,但如果我真的想将它分配给一个字符串变量呢?每次我这样做,它都会返回单位 – user1514567

+0

您可以使用Format.asprintf函数打印到字符串中。 – ivg