F#教程:Pattern Match

这回我们要挑战下match语句:

let s = "red"
match s with
| "red" -> printfn "红"
| "white" -> printfn "白"
| _ -> printfn "其他颜色"

其中,分支的顺序很重要。

_ 可以匹配一切。如果把它写在最开始,其他的条件就不会被匹配到了。

但是,如果写成如下这样:

let n = 2
match n with
| 1 -> printfn "1"
| 2 -> printfn "2"

编译时就会有一个警告: Incomplete pattern matches on this expression. For example, the value '0' will not be matched。说的很明白吧,分支没有覆盖所有情况。改写后如下:

let n = 2
match n with
| 1 -> printfn "1"
| 2 -> printfn "2"
| _ -> printfn " "

但是通过这种方法,1、2以外的值是无法处理的。解决办法如下:

let n = 2
match n with
| 1 -> printfn "1"
| x -> printfn "%A" x

其中,1以外的情况也处理了。通过将其值带入到x,就可以引用到该值。要注意的是:x只是一个符号,z、y以及hoo等等都是可以的。

此外,如下的代码也是可以的:

let    s = [1;2;3;4;5]
match s with
| [] -> printfn "空"
| x::xs -> printfn "%A %A" x xs

运行结果是:

1 [2; 3; 4; 5]

这样,list的第一个元素和其他元素就可以分开操作了。这点和Haskell是一样的。

时间: 2024-10-29 04:05:39

F#教程:Pattern Match的相关文章

F#教程-List

接着上回的数组,这回我们学习list. #light let lista = [1;2;3;4;5] let listb = [6..10] let listc = lista @ listb printfn "%A" listc 和用[| ...|]来表示数组不同,list通过[ ... ]表示,而不用|.和数组一样的是,要素之间通过:(分号)分开,是不是觉得有点奇怪啊? list的连接通过@运算符,有了它就很方便了.这和通过函数进行list连接相比,可读性也提高了. 运行结果是:

F#教程:函数

数据类型说了好几回了,有点烦了吧?这回我们就换个角度,学习下函数吧! 有两个两个输入参数并返回它们的和的简单函数如下: let Add a b = a + b 这就是函数的定义.同样使用了声明变量时的let. 确实感觉很神奇,没有了C#语言那样的冗长.看了这个定义后,有点感觉C#是冗长的语言.调用函数的代码如下: let c = Add 10 20 printfn "%d" c 其中,由于不使用括号有点怪怪的感觉.完整的程序如下: #light let Add a b = a + b

F#教程-Hello world

前言:最近在了解F#,无意中看到一个日文的教程(http://techbank.jp/Community/blogs/gushwell/default.aspx), 觉得很不错,所以希望可以和大家一起分享.学习. F#的学习过程.未解决问题以及失败的经历都会连载到本博客中. 有了Visual Studio 2010提供的环境,我们就可以开始学习F#编程了.那就开始吧!最先我们就做个Hello World应用.实现如下: printf "Hello world!" F6:编译.F5:执行

F#教程:匿名函数(Lambda)

这回我们要学习的是Lambda表达式.F#和C#一样也有匿名函数.不过感觉将匿名函数称为Lambda更好些. 试着写些代码吧: let add = fun x y -> x + y printfn "%A" (add 1 3) 这里我们定义了add函数.这个定义使用了匿名函数(取出x,y两个参数,并将x+y的结果返回).fun就是匿名函数的关键字. 之前有过的函数定义是: let add x y = x + y 这是一种省略形式.不同的只是参数是否在lambda表达式中. 从C#

F#教程:枚举类型

F#中枚举类型的定义实例如下: type Season = | Spring = 1 | Summer = 2 | Autumn = 3 | Winter = 4 使用刚定义过的枚举类型的代码如下: let s = Season.Winter if s = Season.Winter then printfn "冬" else printfn "冬以外" 不过如下代码就会编译出错: if s = "Winter" then printfn &qu

F#教程:递归

目前为止我们已经学习了if.for .while等语句,这样我们就可以尝试写一些简单的程序了. 我们就试着写一个计算从1到指定数总和的程序吧.首先定义个从键盘读取指定值作为输入参数的SumTotal函数. #light let SumTotal n = let mutable ttl = 0 for i = 1 to n do ttl <- ttl + i ttl let s = stdin.ReadLine() let num = System.Int32.Parse(s) printfn &qu

F#教程:不变性

目前为止我们还一直避免的话题就是F#中必须注意的:变量无法再被赋值. let x = 10 let y = 5 let x = x + y // Compile Error 一旦变量赋值以后,再次赋值就会出现错误. F#的变量为什么要有不变性呢? 习惯了目前一些变量是可变的过程语言和面向对象语言,可能就会有变量不可变的话是否可以很好编码的疑问. 这样也就无法写i++以及i += 2之类的增量处理. 去年稍微接触了下Haskell,尽管全部变量都是不变的,但还是可以很好地编码.F#也吸收了 Has

F#教程:while语句

F#里也有while语句.接下来我们就试着使用while语句写代码. <不变性>一文中有人评论说可以适用 ref,我们就试着使用下. while循环的作用域通过缩进表示. let num = ref 0 while !num < 10 do num := !num + 1 printfn "%d" !num ref是表示引用的关键字.把它想象成C语言的指针就好了.num是指针变量,保持了数值0的引用.取值时候使用!操作符.再赋值的时候使用:=.这点和Pascal和类似

F#教程:Tuple

tuple是可以将2个以上的数据汇总起来管理的数据类型.要是C#也有就好了. F#的tuple实例代码如下: #light let data = (1,2) printfn "%A" data printfn "%A" (fst data) printfn "%A" (snd data) fst.snd分别表示 First.Second,可以用来取出最初的两个元素.运行结果是: (1, 2) 1 2 (1,2)和1,2都是OK的,有没有()都一样