F#入门-第二章 F#基础-第七节 条件分歧

■ 条件分歧 

  F#中,关于条件分歧有几种表达方法,if语句为其中之一。使用if语句,可以编程表达“如果...就...”的条件。
    F#中对于if语句的定义如下所示。
    用[]括起来的地方为可选项,表达式后加*的地方表示该表达式可重复书写。

 if
    if语句 := 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");;
posted @ 2010-09-30 14:06  至尊无上  阅读(893)  评论(0)    收藏  举报