11.2.2.1 结构相等和比较

在F# 中,我们能声明的大多数类型,都是不可变的;如果我们不显式提供实现IComparable <T> 接口,并重写 Equals 方法,F# 编译器会自动实现,它是通过比较结构相等(structural equality)实现的。对F# 的类,还不能自动完成,只对简单的函数类型,比如,记录、差别联合和元组,不必要显式声明。

使用这种比较类型的值,如果它们是相等的简单类型,比如,整数或字符串,或者是相同值的组合,使用递归地结构相等,被认为是相等的。清单11.9 演示了记录的结构相等,包含元组和基本值。

清单11.9 用结构相等比较记录(F# Interactive)

> type WeatherItem =

{Temperature : int * int;

Text : string }

letwinter1 = { Temperature = -10, -2; Text = "Winter" }    | 创建记录

letwinter2 = { Temperature = -10, -2; Text = "Winter" };;   | 包含相同值

(...)

> System.Object.ReferenceEquals(winter1,winter2);;   <-- [1] 值表示成不同的实例

val it : bool = false

> winter1.Equals(winter2);;  |

val it : bool = true          | [2] ...

| 但被认为相等

> winter1 = winter2;;       |

val it : bool = true          |

首先,我们声明了F# 记录类型,包含两个字段;第一个字段类型是两个整数的元组,第二个字段是字符串。我们创建了这个记录类型的两个值,每个对应字段的值完全相同。

我们可以看到,确实有两个实例:引用相等的测试[1],返回false。如果我们使用重写的Equals 方法,或者标准的F# 运算符测试相等[2],运行时将使用结构相等,报告这两个值相等。首先,两个元组值比较结构相等,然后,比较两个字符串。

正如我们前面所说,这种方法适用于记录、元组、差别联合和数组;因为不可变的F# 列表声明为差别联合,所以,可以同等对待。我们将在写单元测试期望时,使用此功能,但首先,我们要看一下另外的功能,自动生成函数。我们已经知道使用结构相等,可以测试值是否相等,而F# 还提供了结构比较(structural comparisons),可以排序:

> let summer = { Temperature = 10, 20; Text= "Summer" };;

(...)

> summer = winter1;;

val it : bool = false

> summer > winter1;;

val it : bool = true

这段代码用清单11.9 中声明的记录类型,创建了一个新的值,并与前面清单中的值进行比较。第一个结果并不奇怪:这两个值是不同的;第二个结果值得解释一下。为什么会认为summer 值比winter1 大呢?原因是,F# 编译器还为WeatherItem 类型生成了默认的比较[运算]。比较按照它们声明的顺序,使用字段的值:例如,元组值(10,0) 比(9,100) 大。这个默认行为是有益的,特别是,如果在设计自己的类型时,把它考虑进去。但本章的其余部分,我们侧重于结构相等。

时间: 2024-08-05 16:09:01

11.2.2.1 结构相等和比较的相关文章

风险评估DNV GL AS Phast v7.11.33.0/海洋结构物强度分析DNV sesam suite 2013海洋结构物强度分析

风险评估DNV GL AS Phast v7.11.33.0/海洋结构物强度分析DNV sesam suite 2013海洋结构物强度分析DNV Phast Risk v6.7-ISO 1DVDDNV Phast v6.7-ISO 1DVD 最新6.7版本 全功能无限制DNV sesam suite 2013 Full 1CD包含新的 DeepC .GeniE和HydroD模块.DNV sesam Genie 2013 Full 1CD(用于评估无航速浮体流体动力性能的计算软件)DNV Soft

风险评估分析DNV.GL.AS.Phast.v7.11.33.0/海洋结构物强度分析DNV sesam suite 2013

为了满足您的风险管理目标,你需要对工艺设施所带来的危害有一个强大的认知.使用DNV Phast可以快速和精确的评估灾害类型的多元化所 带来的威胁. DNV GL AS Phast v7.11是世界上最全面的流程工业危害分析软件工具,主要用于所有阶段的设计和运行.从最初释放到远场的分散包括池建 模扩散和蒸发.和易燃及毒性作用,PHAST都支持检查潜在事件的进展. 使用DNV GL AS Phast v7.11你可以获得: 行业标准的后果分析工具,用于易燃.火灾.爆炸和毒性危害的分析. 与行业合作伙

11.2.2 测试结构相等

在C# 中,测试复杂数据结构的相等可能非常棘手.如果我们构造一个新的对象,具有相同的属性,使用== 运算符比较两个对象,其结果很可能是false,因为我们比较的是两个不同的实例. 在C# 中,== 运算符可以被重载,Object.Equals 可以重写,但通常只用于值类型或不可变数据结构.比较可变类型的两个不同实例时,识别两者之间的不同,是很重要的,因为数据可以在以后被改变:相反,如果是两个不可变类型,存储相同的值,我们就可以认为它们相等,因为数据在将来不会改变,所以,两个对象总是相等的.

Class类文件的结构

1.Class文件是一组以8位字节为基础单元的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有任何的分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在.当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割为若干个8位字节进行存储. 2.按照Java虚拟机规定,Class文件格式采用一种类似C语言结构体的伪机构来存储,这种伪结构中只有两种数据类型:无符号数和表. 3.无符号数属于基本的数据类型,以u1.u2.u4.u8来

11 个重要的数据库设计规则

英文原文: 11 Important Database designing rules 简介 在您开始阅读这篇文章之前,我得明确地告诉您,我并不是一个数据库设计领域的大师.以下列出的 11 点是我对自己在平时项目实践和阅读中学习到的经验总结出来的个人见解.我个人认为它们对我的数据库设计提供了很大的帮助.实属一家之言,欢迎拍砖 : ) 我之所以写下这篇这么完整的文章是因为,很多开发者一参与到数据库设计,就会很自然地把 “三范式” 当作银弹一样来使用.他们往往认为遵循这个规范就是数据库设计的唯一标准

struct sk_buff结构体详解

struct sk_buff是linux网络系统中的核心结构体,linux网络中的所有数据包的封装以及解封装都是在这个结构体的基础上进行. struct sk_buff_head  {     struct sk_buff *next;     struct sk_buff *prev;          __u32 qlen;     spinlock_t lock; } struct sk_buff {     struct sk_buff *next;     struct sk_buff

「C语言」「例题」结构体与共用体

本篇收集<C语言程序设计教程>第九章“结构体与共用体”的所有例题. 1 #include <stdio.h> 2 3 /*输入一个学生的基本信息, 4 包括学号.姓名.性别.年龄.出生日期.三门成绩, 5 输出该学生的基本信息和平均成绩*/ 6 7 struct date 8 { 9 int year;/* 年份 */ 10 int month;/* 月份 */ 11 int day; /* 日期 */ 12 }; 13 14 struct student 15 { 16 char

OC类中一些细节问题(对象类存储、类中结构体的用法)

一:OC中得方法名 注意:方法名冒号和后面的and方法名冒号  都是方法名 一:对象的存储细节 类加载到代码区(包括类中得属性和方法).对象动态加载到堆内存中.指向对象的指针存放在栈区. 三:定义类常见的错误 定义类的时候,常见的错误 1)类的定义不能嵌套 2)不要漏写 @end 3) 不要忘记写实现类(如果忘记写了,编译不会报错,运行时候才报错) 4)定义成员变量的大括号经常漏写 5) 如果不写@interface 只有 @implementation 这可以,但是会报警告,建议不要这么写 6

Linux0.11内核剖析–内核体系结构 &#169;Fanwu

Linux0.11内核剖析–内核体系结构 ©Fanwu <Linux内核完全注释>下载:http://files.cnblogs.com/files/HanBlogs/linux-kernel.pdf(进入pdf后要点击右下角保存喔^_^) 一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: 操作系统服务程序是指那些向用户所提供的服务被看作是操作系