F#学习笔记(五) 模式匹配和递归

        这次要说的是F#中的模式匹配,什么是模式匹配,这就相当于C#中的switch语句。根据参数的不同得到不同的结果,如

let patMatch x =
    match x with
    | 0 -> printfn "Value is 0"
    | 1 -> printfn "Value is 1"
    | _ -> printfn "Value is not 0 or 1";;

就是一个简单的模式匹配,这里要提到的是在F#中,当一句语句需要分多行来写时,按惯例子句前需要有4个空格,这样F#才能正确识别出。前面的patMatch的响应结果是val patMatch : int -> unit,同样的可以通过|来把输入参数和多个结果进行匹配

let patMatch x =
    match x with
    | 0 | 1 -> printfn "Value is 0 or 1"
    | _ -> printfn "Value is not 0 or 1";;

同时,F#也提供了对于元组的模式匹配,

let andTrue x =
    match x with
    | (true, true) -> true
    | _ -> false;;
andTrue的参数为一个包含两个布尔类型的元组,响应的结果为val andTrue : bool * bool -> bool

       下面要讲一下模式匹配和递归的组合应用,我们以斐波那契数列来举个例子,斐波那契数列相信大家在大学里都应该学过,就是数列的下一个数值等于前两个数字的和,初始值为0和1,这里列出前10个数值的一个数列,0, 1, 1, 2, 3, 5, 8, 13, 21, 34,那么我们怎么通过F#来实现这么一个数列呢

let rec fib x =
    match x with
    | 0 -> 0
    | 1 -> 1
    | _ -> fib(x - 1) + fib(x - 2);;
就是通过递归的模式匹配来实现,在F#中,递归操作通过关键字rec来实现,他的响应结果是val fib : int -> int,即通过参数得到数列中相应的数值。同样的,递归操作也可用于对List的操作,下面我们来看一下

let rec processList x =
    match x with
    | head::tail -> printfn "processing %i" head; processList tail
    | [] -> printfn "done";;

这就是一个对于List的一个循环遍历操作,我们来仔细分析一下,首先,head::tail表示processList的参数是一个F# List类型的参数,%i(for int)通过设置这个,F#会自动从List的第一个元素开始识别,一直识别到[]前面的元素,不过只能针对int类型的List,在F#中,如果需要在一行中显示两句不同的语句,可以通过分号来分割。

 

 

posted @ 2009-12-04 22:46  不眠小C  阅读(389)  评论(0编辑  收藏  举报