F#学习笔记(六)类型和标签联合

        接着要说的是F#中的标签联合,标签联合(tagged union)也称可辨识联合(discriminated union)或者变体类型(variant type),指的是这样的一种数据结构,它能够存储一组不同但是固定的类型中某个类型的对象,具体是哪个类型由标签字段决定。这种数据结构在解释器、数据库和数据通信中非常有用。在讲解标签联合之前,我们先讲一下F#中的自定义数据类型,我们可以通过type关键字来新建一个数据类型type ItemName = string;;同时也可以定义自己的记录类型

type OrderItem ={ItemOrdered: ItemName;Quantity: int;PricePer: float};;这里就用到了前面定义的ItemName类型,是不是很方便。

      下面要讲的是标签联合,这里我们拿温度来举个例子,温度有摄氏,华氏和绝对(也叫开式)温度,我们可以定义一个温度标签联合类型

type temperature =
| Celsius of float
| Fahrenheit of float
| Kelvin of float;;

    F#discriminated union由两部分组成,参数的类型,在F#中称谓构造器和参数本身,那么定义好了之后,我们怎么来调用呢,我们可以直接通过构造器来调用Celsius 32.0;;响应的结果是val it : temperature = Celsius 32.0表示标识符为摄氏32度,虽然数据的类型是摄氏,但其实都是隶属于温度类型中的,就是上面提到的一组不同但是固定的类型中某个类型的对象。

    在discriminated union中,我们可以用到上一节中提到的模式匹配,如我们需要讲摄氏温度和绝对温度都转换成华氏温度,我们可以这样定义

let convertToFahrenheit x =
    match x with
    | Celsius x -> Fahrenheit (x * (9.0 / 5.0) + 32.0)
    | Fahrenheit x -> Fahrenheit x
    | Kelvin x -> Fahrenheit (x * (9.0 / 5.0) - 459.67);;

这样我们就可以把前面定义的摄氏32度转换成华氏温度

let tmp1 = Celsius 32.0;;

convertToFahrenheit  tmp1;;

F#学习笔记(六)类型和标签联合

 



 


 


 

转载于:https://www.cnblogs.com/sleeplessC/archive/2009/12/05/1617834.html