Ray*_*oal 21
如果您将打印嵌入表达式序列中,您将没有问题.
UPDATE
这是一个具体的例子,因为上面的答案相当短,而且,只有链接的答案才是好的答案.它是阶乘的经典尾递归公式(是的,无聊的,但熟悉的):
# let fac n =
let rec f i n acc =
if i >= n
then acc
else (Printf.printf "%8d%8d%8d\n" i n acc; f (i+1) n ((i+1)*acc))
in
f 0 n 1;;
val fac : int -> int = <fun>
# fac 5;;
0 5 1
1 5 1
2 5 2
3 5 6
4 5 24
- : int = 120
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到打印的副作用,但结果仍然是预期的120.
Jef*_*eld 12
由于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
Run Code Online (Sandbox Code Playgroud)
它工作后你可以删除(*DEBUG*)注释中的东西.
注意使用%!刷新缓冲区.如果您使用printf(像我一样)进行大量调试,了解这一点非常有用.
这是一个简单的示例,表明Ray Toal 的答案中提到的表达式序列不一定需要用括号括起来:
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
Run Code Online (Sandbox Code Playgroud)
丢弃函数返回值的另一种方法是ignore:
ignore (Printf.printf "Debug info");
Run Code Online (Sandbox Code Playgroud)