■ 条件分歧
F#中,关于条件分歧有几种表达方法,if语句为其中之一。使用if语句,可以编程表达“如果...就...”的条件。
F#中对于if语句的定义如下所示。
用[]括起来的地方为可选项,表达式后加*的地方表示该表达式可重复书写。
ifif语句 := if 表达式1 then 表达式2 [elif 表达式3 then 表达式4]* [else 表达式5]
上面这段语句的意思是
如果if表达式1条件成立(表达式1的值为true),则继续执行表达式2。
否则(elseif)如果表达式3条件成立(表达式3的值为true),则继续执行表达式4。
否则继续(else)执行表达式5。
如果条件成立,执行了后续表达式之后,不再执行其他不符合条件的表达式。
表达式1与表达式3为条件判断表达式,判断表达式中的条件是否成立(返回true或false)。
同时,表达式2,表达式4,表达式5必须返回同样的数据类型。
if语句默认返回unit型的值,所以如果省略“else 表达式5",则表达式2与表达式4必须要将返回值写成unit类型的值(),因为省略的表达式5返回unit类型,这一点请注意。
同时,整段语句返回程序真正执行到的表达式所返回的值。
if语句示例
if a=1 then print_endline "hello world";;
上面这段语句表示,如果a的值为1,则显示"hello world"。
“=“符号判断等式两边是否相等。
相等返回true
不相等返回false
请注意在c语言及Java语言中,=表示赋值,==才表示条件判断。
多条件分歧示例
let time = 15 in
if time < 11 then printfn "Good morning"
elif time < 16 then printfn "Good afternoon"
elif time < 20 then printfn "Good evening"
else printfn "Good night";;
以上这段语句根据不同的time值,显示相对应的字符串。将time修改成15之外的值,将显示与之相对应的字符串。
因为语句2与语句3的数据类型不同所产生的错误
if true then 1 else "one";; /这句将产生错误
请注意以下示例。
语句2与语句5的数据类型不同,所以也会产生错误。
省略else时也须注意
if true then 1;; //这句也是错误的
if true then 1 else 2;; //这样写是正确的
上面这个示例中,因为else被省略了,所以else语句返回(),1为int型,所以引发编译错误。
在没有熟悉F#的时候,有很多特别容易忽略而引发错误的地方,所以请特别注意.
if语句返回值的利用
let kekka = if 1=2 then "OK" else "NG" in
print_endline kekka;;
上述示例中,1与2如果相等,kekka变量值绑定为OK,如果不相等,变量值绑定为NG,然后将该变量值显示。
习惯使用C语言或Java语言的人可能会看不懂,但是F#中是可以这样直接利用if语句所返回的值的。
■ 单分号与双分号
双分号用来表示语句结束。
单分号用来在语句中作分隔。
分号的使用
let str = "hello" in
print_string str;
print_endline "world";;
在介绍基本类型的时候,我们已解释过任何语句都会返回某个值,哪怕是unit值()。用单分号做分隔时,语句返回分隔符“;”前的最后一句语句的返回值,单分号分隔符前面的语句的返回值均被舍弃,同时,不完全语句(单分号前的语句或加了括号的语句)如果返回()以外的值,均被判断为错误,所以,这种情况下需要使用到ignore函数。
ignore函数示例
open System.Windows.Forms;;
let debug = true in
if debug then ignore (MessageBox.Show "in debug");;
执行以上这段代码,将显示“in debug"对话框,MessageBox.Show函数返回的值为DialogResult类型,所以为了让它返回unit类型,需要使用ignore函数。
另外,如果使用管道运算符,可以编写类似以下代码。
管道运算符使用示例
MessageBox.Show "in debug" |> ignore;;
另外,因为if语句后面紧跟语句,所以编写复杂的语句时需要用括号括起来。
设想的结果与实际结果不一致的例子
let debug = false in
if debug then
print_string "now ";
print_endline "in debug";;
正确写法
let debug = false in
if debug then
(print_string "now ";
print_endline "in debug");;