OCaml打印声明

dxu*_*dxu 14 printing syntax ocaml

是否可以在代码块中放置用于调试/测试的print语句?例如,在Java中,您可以System.out.println("")在方法的中间使用来检查变量或其他东西,但在OCaml中,命令会像print_string工作吗?它不会返回类型单位的值,从而导致错误,而不是允许您打印它?

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(像我一样)进行大量调试,了解这一点非常有用.


Mat*_*aun 7

这是一个简单的示例,表明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)