问题描述
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
并且我想在另一个函数内或 *.ml 文件内的某处打印 regraUm 250。
示例:let _ = printf let m = regraUm 250
完整代码:
open Printf
open Format
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
let _ = printf let m = regraUm 250
当我尝试使用 ocamlopt program.ml -o a 编译它时,它什么也不做。
解决方法
如果您运行像 ocamlformat
这样的自动格式化程序,您会发现它会将您的代码重新格式化为:
open Printf
open Format
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
let _ = printf;;
let m = regraUm 250;;
本质上,您将 _
定义为 printf
的别名,然后定义一个常量 m
。
做您想做的事情的方法是将 m
传递给 printf
,但您还需要一个格式字符串(请参阅 the documentation for Printf:
open Printf
open Format
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
let m = regraUm 250;;
(* note that by putting () instead of the wildcard _ here,the compiler can warn
you if you statement returns a valid that you're unintentionally ignoring *)
let () = printf "%d" m;;
您也可以使用 let ... in
语句或括号。
这将 m
定义在当前语句的范围内,而不是作为全局:
let () =
let m = regraUm 250 in
printf "%d" m;;
这直接传递值:
let () =
printf "%d" (regraUm 250);;
,
我在我的环境中尝试了你的代码,我得到了这些输出: 您没有正确使用 printf 函数,但我不明白为什么您没有任何编译器错误,如果我们命名它,似乎 ocaml 将您的代码行解释为 printf 函数。无论如何,请务必在此处查看文档:{{3}} 这里有你想要的
let m = regraUm 250 in printf "%d" m;;
(*or just*)
printf "%d" @@ regraUm 250;;
(*which is the same as*)
printf "%d"(regraUm 250);;