F# 学习笔记(函数基础2模式匹配)

模式匹配表达式:

[<EntryPoint>]
let main argv =
    let eval x =
        match x with
        |5 -> "优"
        |4 -> "良"
        |3 -> "中"
        |_ -> "差"
    let y = eval 4
    let s = Array.map eval [|3; 2; 1; 5|]
    0 // 返回整数退出代码

在这里表达式中Array.map 函数,数组的每一个元素应用到eval进行模式匹配。

在模式匹配中使用条件表达式,下面定义一个分段函数:

[<EntryPoint>]
let main argv =
    let f x =
        match x with
        | _ when (x < -1.0) -> 1.0+x
        | _ when (x <= 1.0) -> 0.0
        | _ -> 1.0-x
    printfn "f(-2)= %f f(0.5)=%f f(3)=%f" (f -2.5) (f 0.5) (f 3.0)
    0 // 返回整数退出代码

多参数函数:

[<EntryPoint>]
let main argv =
    let g x y =
        match x,y with
        | (1,_) -> y
        | (_,1) -> 2*x
        | _ -> 2*x+y
    printfn "%i" (g 2 1)
    0 // 返回整数退出代码

多个模式还可以用竖线组合在一起:

let main argv =
    let check pwd =
        match pwd with
        | "aaa" | "AAA" -> "密码正确"
        | _ -> "密码错误"
    let grade r =
        match r with
        | (s, _, x) when x >= 70 -> printfn "%s 通过" s
        | (s, ‘女‘, _) & (_, _, x) when x >= 60 -> printfn "%s 通过" s
        | (s, _, _) -> printfn "%s 未通过" s
    ("李明",‘男‘, 68) |> grade
    "aaa" |> check |> printfn "%s"
    "AAA" |> check |> printfn "%s"
    0 // 返回整数退出代码

用|表示或,用&表示与,使用管道符应用函数,我觉得这样写更加优美

使用模式匹配要注意两个重要的问题:

1.模式匹配组合要完整

2.防止永远不可能匹配的模式

记录联合,可选类型匹配

记录匹配:

type FullName = { First: string; Last: string; }
[<EntryPoint>]
let main argv =
    let IsFamily x s =
        match x with
        | { First = _; Last = fi } when fi = s -> true
        | _ -> false
    let fn = "强"
    let b1 = IsFamily { First = "小强"; Last = "强" } fn
    let b2 = IsFamily { First = "欧阳"; Last = "阳" } fn
    b1.ToString() |> printfn "%s"
    b2.ToString() |> printfn "%s"
    0 // 返回整数退出代码

联合类型匹配:

type Vehicle = | Car | Truck | Bus
[<EntryPoint>]
let main argv =
    let speed x =
        match x with
        | Car -> 100
        | Truck -> 60
        | Bus -> 80
    let mutable v1 = Car
    v1 |> speed |> printfn "%i"
    v1 <- Bus
    v1 |> speed |> printfn "%i"
    0 // 返回整数退出代码

下面是使用模式匹配与联合类型将各种单位的长度数值转换成毫米值:

type Length =
    | Meter of float
    | Millimeter of float
    | Foot of float
    | Inch of float
[<EntryPoint>]
let main argv =
    let ToMM x =
        match x with
        | Meter x -> x * 1000.0
        | Millimeter x -> x
        | Foot x -> x * 304.8
        | Inch x -> x * 25.4
    let l1,l2,l3 = Meter 3.2, Foot 0.5, Inch 8.7
    printfn "l1:%.2fmm, l2:%.2fmm, l3:%.2fmm" (ToMM l1) (ToMM l2) (ToMM l3)
    0 // 返回整数退出代码

可选类型匹配,可选类型本身也是一种联合类型,因此对它也可以采用模式匹配的方式:

[<EntryPoint>]
let main argv =
    let valid x =
        match x with
        | Some(1) | Some(2) -> "不及格"
        | Some(x) -> "及格"
        | None -> "缺考"
    let x1, x2 = Some(5), None
    let y1, y2 = valid x1, valid x2
    y1 |> printfn "%s"
    y2 |> printfn "%s"
    0 // 返回整数退出代码
时间: 2024-10-17 09:23:52

F# 学习笔记(函数基础2模式匹配)的相关文章

F# 学习笔记(函数基础)

因为只是笔记,所以只记录自己觉得要注意与需要理解的地方,其他就不记了 函数定义上F#有自己的写法: [<EntryPoint>] let main argv = let f1 = fun x -> x * x - 2 * x let f2 x = let x1 = x - 2 x * x1 printfn "%i" (f2 10) printfn "%i" (f1 10) 0 f1是很好理解的,因为基本上现在支持lambda表达式的基本都是第一种写

F# 学习笔记(函数基础3)

递归函数: 在F#中一般不允许调用自身,而只能通过关键字rec来声明其为递归函数: 最大公约数的应用,使用辗转相除法: [<EntryPoint>] let main argv = let rec gcd(a,b) = if a = 1 then b elif b = 1 then a elif a = b then b else if a > b then gcd(a-b, b) else gcd(a,b-a) (72,54) |> gcd |> printfn "

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

MySQL学习笔记之九 字符串模式匹配

我们在使用查询的时候,经常会碰到模糊条件查询,而模糊查询就涉及到了字符串模式匹配. 在这里,主要讲两个:标准的SQL模式匹配.扩展正则表达式模式匹配.     一.标准的SQL模式匹配 SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在MySQL中,SQL的模式缺省是忽略大小写的.下面显示一些例子.注意在你 使用SQL模式时,你不能使用=或!=:而使用LIKE或NOT LIKE比较操作符. 为了找出包含正好5个字符的名字,

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack

01-Python学习笔记-基础语法

Python标识符 -d           在解析时显示调试信息 -O           生成优化代码 ( .pyo 文件 ) -S           启动时不引入查找Python路径的位置 -v            输出Python版本号 -X           从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时. -c cmd     执行 Python 脚本,并将运行结果作为 cmd 字符串. file           在给定的python文件执行python脚本. P

PHP:学习笔记(2)——基础语法

PHP:学习笔记(2)--基础语法 向屏幕输出 说明 1.void echo ( string $arg1 [, string $... ] ) 2.int print ( string $arg ) 注意: 1.echo.print 实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号来括起它的参数列表. 2.输出变量的时候需要使用双引号! 3.int printf ( string $format [, mixed $args [, mixed $... ]] ) 4.strin

jQuery学习笔记——jQuery基础核心

代码风格 在jQuery程序中,不管是页面元素的选择.内置的功能函数,都是美元符号“$”来起始的.而这个“$”就是jQuery当中最重要且独有的对象:jQuery对象,所以我们在页面元素选择或执行功能函数的时候可以这么写: $(function () {}); //执行一个匿名函数 $(‘#box’);//进行执行的ID元素选择 $(‘#box’).css(‘color’, ‘red’);//执行功能函数由于$本身就是jQuery对象的缩写形式,那么也就是说上面的三段代码也可以写成如下形式:jQ

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快