F#教程:Record


F#和C#语言一样可以定义构造体。不过F#将这称为Record。

  可以试着定义如下Point类型的 Record:

  type Point = { x: float; y: float}

  使用Point类型的代码:

let pt = { x = 10.0; y = 15.0 } 
printfn "(%f , %f)" pt.x pt.y

  let一行声明 pt时候就没有指定类型,不过F#却可以知道它是Point类型。很有趣,甚至有点吃惊是不是?

  如果定义值两个所有域的名称和类型都一样的Record会如何呢?

type Point = { x: float; y: float} 
type Point2 = { x: float; y: float} 
let pt = { x = 10.0; y = 15.0 }

  在F# Interactive窗口执行后结果如下:

  val pt : Point2 = {x = 10.0; y = 15.0;}

  pt的类型变成了Point2。是不是有点混乱啊。

  我们在试着定义如下所有域值的名称相同但类型不同的Record:

type Point = { x: float; y: float} 
type Vector = { x: int; y: int} 
let p = { x = 10.0; y = 15.0 }

  let行会出现编译错误。虽然值域名称一样,类型不一样就无法推论。

  为了消除编译错误,可以显式地指明类型:

let p = { x = 10.0; y = 15.0 } : Point 
let v = { x = 10; y = 15 } : Vector

  其中,「: 类型名」指定方式和Pascal很相似


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3