Printing OCaml打印语句

Printing OCaml打印语句,printing,syntax,ocaml,Printing,Syntax,Ocaml,是否可以将调试/测试的打印语句放在代码块中?例如,在Java中,可以使用 St.Un.Out.PrtLnn(“”)< /C> >检查变量或其他东西,但是在OCAML中,像“代码> Primtjava Stists”这样的命令是否有效?它不会返回一个unit类型的值,从而导致错误,而不允许您打印它吗?如果您将打印嵌入到 更新 这里是一个具体的例子,因为上面的答案相当简短,而且,仅仅带有链接的答案不是好的答案。这是阶乘的经典尾部递归公式(是的,很无聊,但很熟悉): #让fac n= 让我们根据= 如

是否可以将调试/测试的打印语句放在代码块中?例如,在Java中,可以使用<代码> St.Un.Out.PrtLnn(“”)< /C> >检查变量或其他东西,但是在OCAML中,像“代码> Primtjava Stists<代码>”这样的命令是否有效?它不会返回一个unit类型的值,从而导致错误,而不允许您打印它吗?

如果您将打印嵌入到

更新

这里是一个具体的例子,因为上面的答案相当简短,而且,仅仅带有链接的答案不是好的答案。这是阶乘的经典尾部递归公式(是的,很无聊,但很熟悉):

#让fac n=
让我们根据=
如果i>=n
然后acc
else(Printf.Printf“%8d%8d%8d\n”在附件中;f(i+1)n((i+1)*附件))
在里面
f0n1;;
val fac:int->int=
#fac 5;;
0       5       1
1       5       1
2       5       2
3       5       6
4       5      24
-:int=120
在这里,您可以看到打印的副作用,但结果仍然是预期的120。

由于OCaml不是一种纯函数式语言,有很多方法可以做到这一点。下面是我编写这种代码的方法,只是一个具体的例子

let rec mylength list =
(* DEBUG *)
let () = Printf.printf "mylength here, null list: %b\n%!" (list = [])
in
(* DEBUG *)
    match list with
    | [] -> 0
    | _ :: rest -> 1 + mylength rest
工作完成后,您可以删除(*DEBUG*)注释中的内容


注意%的用法!刷新缓冲区。如果您像我一样使用
printf进行大量调试,了解这一点非常有用。

下面是一个简单的示例,说明中提到的表达式序列不一定需要括号:

let get_a_string = 
  let a_string = "a string" in
  (* The semicolon causes the return value of the statement to be discarded *)
  Printf.printf "Debug: %s\n" a_string; 
  a_string

let () = Printf.printf "Result: %s\n" get_a_string
放弃函数返回值的另一种方法是使用
忽略

ignore (Printf.printf "Debug info");

在这里编写
(*DEBUG*)Printf.Printf“mylength,null list:%b\n%!”(list=[])会更简单;(*DEBUG*)
Sure;就像我说的,我只是在展示我真正的写作方式。我不敢在parens之外使用分号,因为我还有很多先例要学习。太好了,非常感谢!这正是我要找的。表达式序列通常用于其他用途,还是这是它们的主要用途?我想你也可以用它来改变变量的值?是的,任何需要更新状态的事情,比如更新引用的值,通常都是这样处理的。关于这一点有一个非常详细的讨论,请参阅“序列”一节。链接已失效,仅供参考。Ocaml不同于Java,您不需要打印任何您想要的内容。例如,要打印列表,您必须编写它。。。因为在ocaml中,您并不是只有对象。
ignore (Printf.printf "Debug info");