Chapter3 - Defining Types - Union

本文通过两个实例介绍 F# 中 Union 类型的应用:一是转换不同单位的体积,二是构造并打印完全二叉树。展示了 Union 在模式匹配中的灵活性。
Union 可以将具有不同含义或不同结构的数据绑定在一起。

他的使用方式我用例子来讲解吧。

 


let Volume =
| Liter of float
| UsPint of float
| ImperialPint of float

let vol1 = Liter 2.5

let vol2 = UsPint 2.5

let vol3 = ImperialPint 2.5


 

看起来好像什么用也没有,是吧,别急,我们先来看看他的模式匹配。

 


let convertVolumeToLiter x =
    
match x with
    
| Liter x -> x
    
| UsPint -> x * 0.473
    
| ImperialPint x -> x * 0.568

printfn convertVolumeToLiter vol1

printfn convertVolumeToLiter vol2

printfn convertVolumeToLiter vol3


 

这里的模式匹配它可以接收一个范式定义的 Volume,然后判断他的类型,是Liter 还是 UsPint

或 ImperialPint ,然后对其做不同的处理。

嗯,还是感觉不到他的魔力,好吧,看下一个例子。

 

这个是一个完全二叉树的例子,唯一的区别就是,在这里节点是没有值的,只有最终的叶子才有值。

 


#light

type 'a BinaryTree =
| BinaryNode of 'a BinaryTree * 'a BinaryTree
| BinaryValue of 'a

let tree1 =
    BinaryNode( 
//根节点
        BinaryNode( BinaryValue 1, BinaryValue 2), //子节点1,具有1跟2两个叶子
        BinaryNode( BinaryValue 3, BinaryValue 4) ) //子节点2,具有3跟4两个叶子

//看到了么,这里我们借助一个范式的类型 BinaryTree,就很自然的表现出了一颗二叉树。
//它有一个根节点,两个子节点,然后每个子节点又有两个值。
//然后是利用模式匹配来输出这棵树


let rec printBinaryTreeValues x =
    
match x 
    
| BinaryNode (node1, node2) ->
          printBinaryTreeValues node1;
          printBinaryTreeValues node2
    
| BinaryValue x -> printfn x;printfn ""


 

然后来看看一颗普通的树,当然,这里只是为了展示两种不同的定义方法而已。

 


type Tree<'a> =
| Node of Tree<'a> list
| Value of 'a

let tree2 =
    Node( [ Node( [Value 
"one"; Value "two"] );
    Node( [Value 
"three"; Value "four"]) ] )

 
let rec printTreeValues x =
    
match x with
    
| Node l -> List.iter printTreeValues l
    
| Value x ->
        printfn x;printfn 
","
 


转载于:https://www.cnblogs.com/SinSay/archive/2010/09/27/1836439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值