前言:最近在了解F#,无意中看到一个日文的教程(http://techbank.jp/Community/blogs/gushwell/default.aspx),觉得很不错,所以希望可以和大家一起分、学习。

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很相似。