Records是F#里用来表示简单数据的一种基本数据类型,当你想把数据组成一个结构化的格式,而不需要太复杂的语法时,你可以使用Record类型。

声明Records类型:

Records的语法格式如下:

[ attributes ]
    type [accessibility-modifier] typename = {
        [ mutable ] label1 : type1;
        [ mutable ] label2 : type2;
        ...
        }
        member-list

这里我们定义一个简单的Point类型:
    type Point = { x : float; y: float; }

创建Records对象:

声明Point类型后,就可以定义Point对象了:
    let mypoint1 = { x = 1.0; y = 1.0; }
    let mypoint2 = { new Point with x = 1.0 and y = 1.0 }

这里我使用了两种方式创建了Point对象,mypoint1并没有指明类型,F#会自动根据其成员推导出其类型。但如果有两个不同的Records具有同样的成员,则会产生二义性,如下所示:

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

let mypoint1 = { x = 1.0; y = 1.0; }
    let mypoint2 = { new Point with x = 1.0 and y = 1.0 }

这个时候,mypoint1就可能和两种类型Point和Point2D都对应,虽然这个时候有了二义性,但本身还是没有语法错误的,系统会自动将mypoint1推导为后定义的point2D类型。如果要定义Point类型,则只有使用mypoint2这种制定类型的方式创建。

另外,还可以通过表达式的方式创建Point对象:
    let mypoint3 = { mypoint1 with y=5.0 }
    //val mypoint3 : Point = {x = 1.0; y = 5.0;}

这里mypoint3继承了mypoint对象,并重新定义了y对象,非常直观,就不多讲了。

定义方法和属性:

定义方法和属性非常简单,示例如下:

type Point = { x : float; y: float; }
       with
        member p.Length =
               sqrt <| p.x ** 2.0 + p.y ** 2.0
        member p.Show() =
               printf "%A" p

模式匹配

Records的模式匹配和Tuples类似,但由于其成员都有唯一的名称,匹配部分成员是可以不需要通配符,如下所示:

let filterPoint (points:Point list) =
        points
        |> List.filter
           (function
            | {x = 1.0} | {y = 1.0} –> true
            | _ ->false)

filterPoint [mypoint1; mypoint2; mypoint3]

小结:

Records是F#的一种基本结构,用来定义简单的数据,使用起来也比较灵活而简单。

目前唯一不大习惯的是其创建方式,由于没有构造函数,成员不能使用缺省值,需要指定所有成员。这一点远没有C#创建对象并初始化成员那样来得灵活。并且由于其类型往往是靠推导出来的,创建的时候在VisualStudio中没有智能提示,一旦有一个成员名称拼写错误或类型不正确就有语法错误,这决定了其成员不宜过多,并且不宜使用过于复杂的名称,而C# 的IDE在这方面就要强大很多,基于其强大的智能提示,用C#写的代码基本上都是一次性成功,很少有语法错误。

转载于:https://www.cnblogs.com/TianFang/archive/2010/01/24/1655189.html

F#基本类型——Records相关推荐

  1. F#简明教程二:F#类型系统和类型推断机制

    [51CTO独家特稿]在上一篇教程<F#与函数式编程概述>中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访< ...

  2. INTRODUCING F#

    第一篇,从零开始编写我们的第一个F#程序. 什么是F#,我为何要学它? F#是一种.NET平台上的函数式编程语言.就像C#和VB.NET,F#可以利用.NET的核心类库,如WPF,WCF,VSTO等等 ...

  3. Go 学习笔记(4)— Go 标识符、数据类型之间转换、布尔型、整型、浮点型、interface 类型

    1. 标识符整体分类 Go 标识符整体分类如下图所示: 2. 数据类型分类 Go 语言按类别有以下几种数据类型: 类型 描述 布尔型 布尔型的值只可以是常量 true 或者 false 数字类型 整型 ...

  4. java泛型的泛型_Java 泛型总结(一):基本用法与类型擦除

    简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型.泛型可以用于类.接口.方法,通过使用泛型可以使代码更简单.安全.然而 Java ...

  5. Python-Day3-数据类型

    数据类型 数据 int(整型) 32位计算机长度 -2**31-2**31-1 64位计算机长度 -2**63-2**63-1 超过以上范围为 Long (长整型) Python2.2--运算数据超过 ...

  6. [转]符号和运算符参考 (F#)

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd233228.aspx 本主题包含一个表,其中列出了 F# 语言中使用的符号和运算符. 符号和运算符表   ...

  7. c语言省2全民,C语言省试题(2-数据类型)101016.ppt

    C语言省试题(2-数据类型)101016 C语言省试题(第2章 数据类型及表达式) 计算机与软件学院 填空题(省试题2009C2-2) 若有声明"int x;"且sizeof(x) ...

  8. Scalaz(27)- Inference Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...

  9. 科目移动类型替代规则总结

    BCS部分明细报表项目是通过科目加移动类型来取数的,如果ECC业务处理帐务余额正确,但是业务处理过程中移动类型输入或派生不符合科目增减变动实际,仍将导致BCS明细表出错.由于系统移动类型输入或派生规则 ...

最新文章

  1. 【hdu4281状态压缩+01背包+多旅行商问题】
  2. 程序员面试题精选100题(50)-树的子结构[数据结构]
  3. 「氮科技」加持下,「疾速奔跑」的安踏超越耐克还需多久?
  4. Matlab | 用Matlab写一首歌送给女朋友——程序员必备撩妹技能(Matlab源码)
  5. MTK MtkSettings Sim Dialog Patch
  6. python-1day
  7. Git(11)-cherry-pick、reset、rebase
  8. 【英语学习】【Daily English】U07 Restaurant L01 What's a seafood paella, though?
  9. Verilog实现2分频实例
  10. Jar mismatch! Fix your dependencies的问题(转)
  11. OpenGL编程指南(第8版)PDF
  12. 原生JS与其他JS 区别
  13. [论文总结] 深度学习在农业领域应用论文笔记10
  14. 符号集合近似法SAX
  15. 置换 置换群 应用 +置换群对某些算法问题的解释
  16. KL15 KL30 KL31 KL50 KLR
  17. Framer 指南:从设计到编程、组件及其它
  18. 网页防篡改技术的前世与今生
  19. 茅坡村计算机技术学院,名牌大学的恶搞自嘲外号
  20. 黄金斗士原生android,联想黄金斗士S8 (S898T+)官方固件rom系统刷机包

热门文章

  1. Android疯狂ListView之旅 第一季 《侧滑删除条目》
  2. JS进阶 你真的掌握变量和类型了吗?
  3. Mr.J--JS学习(继承模式发展史)
  4. 第三次作业——朱华泓
  5. 牛客网——奥运排序问题
  6. python使用opencv实现人脸识别系统
  7. 关于Context []startup failed due to previous errors
  8. 5月份美网络游戏用户达8700万 同比增长22%
  9. JavaScript的this关键字的调用位置和绑定
  10. Nodejs Promise对象