这次要说的是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#中,如果需要在一行中显示两句不同的语句,可以通过分号来分割。