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

时间: 2025-01-27 08:32:36

F#教程:Record的相关文章

F#教程:向函数传入Record类型

我们继续Record的学习.我们试着定义并调用一个传入Vector类型参数的magnify函数: type Vector = { x: int; y: int} let magnify v n = { x = v.x * n; y = v.y * n} let v = { x = 10; y = 15 } printfn "%A" (magnify v 2) 但是,如果是如下代码就会出现编译错误: type Vector = { x: int; y: int} type Point =

F#教程-Hello world

前言:最近在了解F#,无意中看到一个日文的教程(http://techbank.jp/Community/blogs/gushwell/default.aspx), 觉得很不错,所以希望可以和大家一起分享.学习. F#的学习过程.未解决问题以及失败的经历都会连载到本博客中. 有了Visual Studio 2010提供的环境,我们就可以开始学习F#编程了.那就开始吧!最先我们就做个Hello World应用.实现如下: printf "Hello world!" F6:编译.F5:执行

F#教程:匿名函数(Lambda)

这回我们要学习的是Lambda表达式.F#和C#一样也有匿名函数.不过感觉将匿名函数称为Lambda更好些. 试着写些代码吧: let add = fun x y -> x + y printfn "%A" (add 1 3) 这里我们定义了add函数.这个定义使用了匿名函数(取出x,y两个参数,并将x+y的结果返回).fun就是匿名函数的关键字. 之前有过的函数定义是: let add x y = x + y 这是一种省略形式.不同的只是参数是否在lambda表达式中. 从C#

F#教程:枚举类型

F#中枚举类型的定义实例如下: type Season = | Spring = 1 | Summer = 2 | Autumn = 3 | Winter = 4 使用刚定义过的枚举类型的代码如下: let s = Season.Winter if s = Season.Winter then printfn "冬" else printfn "冬以外" 不过如下代码就会编译出错: if s = "Winter" then printfn &qu

F#教程:函数

数据类型说了好几回了,有点烦了吧?这回我们就换个角度,学习下函数吧! 有两个两个输入参数并返回它们的和的简单函数如下: let Add a b = a + b 这就是函数的定义.同样使用了声明变量时的let. 确实感觉很神奇,没有了C#语言那样的冗长.看了这个定义后,有点感觉C#是冗长的语言.调用函数的代码如下: let c = Add 10 20 printfn "%d" c 其中,由于不使用括号有点怪怪的感觉.完整的程序如下: #light let Add a b = a + b

F#教程:递归

目前为止我们已经学习了if.for .while等语句,这样我们就可以尝试写一些简单的程序了. 我们就试着写一个计算从1到指定数总和的程序吧.首先定义个从键盘读取指定值作为输入参数的SumTotal函数. #light let SumTotal n = let mutable ttl = 0 for i = 1 to n do ttl <- ttl + i ttl let s = stdin.ReadLine() let num = System.Int32.Parse(s) printfn &qu

F#教程:不变性

目前为止我们还一直避免的话题就是F#中必须注意的:变量无法再被赋值. let x = 10 let y = 5 let x = x + y // Compile Error 一旦变量赋值以后,再次赋值就会出现错误. F#的变量为什么要有不变性呢? 习惯了目前一些变量是可变的过程语言和面向对象语言,可能就会有变量不可变的话是否可以很好编码的疑问. 这样也就无法写i++以及i += 2之类的增量处理. 去年稍微接触了下Haskell,尽管全部变量都是不变的,但还是可以很好地编码.F#也吸收了 Has

F#教程:while语句

F#里也有while语句.接下来我们就试着使用while语句写代码. <不变性>一文中有人评论说可以适用 ref,我们就试着使用下. while循环的作用域通过缩进表示. let num = ref 0 while !num < 10 do num := !num + 1 printfn "%d" !num ref是表示引用的关键字.把它想象成C语言的指针就好了.num是指针变量,保持了数值0的引用.取值时候使用!操作符.再赋值的时候使用:=.这点和Pascal和类似

F#教程:Tuple

tuple是可以将2个以上的数据汇总起来管理的数据类型.要是C#也有就好了. F#的tuple实例代码如下: #light let data = (1,2) printfn "%A" data printfn "%A" (fst data) printfn "%A" (snd data) fst.snd分别表示 First.Second,可以用来取出最初的两个元素.运行结果是: (1, 2) 1 2 (1,2)和1,2都是OK的,有没有()都一样