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

来源:互联网 发布:淘宝语嫣 编辑:程序博客网 时间:2024/05/01 06:43

■ 条件分歧 

  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类型的值(),这一点请注意。
    同时,整段语句返回程序真正执行的语句所返回的值。

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 "Hello"
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" inprint_endline kekka;;


    上述示例中,1与2如果相等,kekka变量值绑定为OK,如果不相等,变量值绑定为NG,然后将该变量值显示。
    习惯使用c语言或Java语言的人可能会看不懂,但是F#中是可以这样直接利用if语句所返回的值的。

    如下例所示,if语句可以看起来好像是函数,但是实际上与函数不同。
    请确认如下程序。

与自身if的比较

//if函数的定义
//cond如果为true,则返回e1,如果为false,则返回e2
let if2 cond e1 e2 = if cond then e1 else e2;;

//使用if函数
> if2 true 1 0;;
val it : int = 1
> if true then 1 else 0;;
val it : int = 1

//但是如果书写带有副作用的语句
> if true then printfn "OK" else printfn "NG";;
OK
val it : unit = ()
> if2 true (printfn "OK") (printfn "NG");;
OK
NG
val it : unit = ()

//if与函数不同,函数的时候,全体参数都参与语句。
//因此,以下代码中if2函数会做loop循环。
> if true then printfn "OK" else while true do () done;;
OK
val it : unit = ()
> if2 true (printfn "OK") (while true do () done);;
OK
//这里会进行死循环
- Interrupt



■ 单分号与双分号

    双分号用来表示语句结束。
    单分号用来在语句中作分隔。

分号的使用
let str = "hello" in
print_string str;
print_endline "world";;


    在介绍基本类型的时候,我们以解释过任何语句都会返回某个值。用单分号做分隔时,语句返回分隔的最后一句语句的返回值,单分号分隔符前面的语句的返回值均被舍弃,同时,使用单分号的语句如果返回()以外的值,均被判断为错误,所以,这种情况下需要使用到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");;


关于常州蓝博纺织机械有限公司的产品被常州蓝博节能设备有限公司非法假冒的声明

原创粉丝点击