OCaml是否可以创建单个if(没有其他)

use*_*757 9 ocaml control-structure

是否可以创建单个if(没有其他)?如果可以使用一个非常有用

Bas*_*tch 12

阅读控制结构: Ocaml手册的条件部分§6.7.2.

只有elsethen部分(因此整个if表达式)属于unit类型时才能避免.例如

let x = 3 in
   ( if x > 0 then Printf.printf "x is %d\n" x );
   x + 5
;;
Run Code Online (Sandbox Code Playgroud)

应该打印x is 3,并返回值8.

一般规则是 if ? then ?相当于 if ? then ? else ()因此"then部分" ?必须是unit类型而"else部分"是默认的,()所以整个ifunit类型.

let x = 3 in ( if x > 0 then "abc" ); x + 7 (*faulty example*)
Run Code Online (Sandbox Code Playgroud)

甚至不会编译因为"abc"不是unit类型(像是())

你可能有时会使用ignore(从功能Pervasives)的then部分,迫使它是unit类型(但是这是值得的,只有当它有显著 的副作用 ;如果更换"abc"ignore "abc"然后我错误的例子就是编译,但仍然没用).

但是,不要忘记Ocaml只有表达式(但根本没有语句).副作用表达式通常是unit类型(但你可以,但通常不赞成,定义一个计算一些非unit结果具有有用的副作用的函数).