9.2.1 使用保存的函数记录

使用记录保存函数,是 OCaml 中的常用方法,在 F# 中有所扩展。在看到可能的改进之前,清单 9.7 为第八章的原始解决方案提供了提醒功能。

清单 9.7 用函数的记录检查客户 (F#)

type ClientTest =   <-- 表示检查

{ Check : Client –> bool

Report : Client-> unit }

let testCriminal(client) =client.CriminalRecord = true

let reportCriminal(client) =

printfn "‘%s‘ has a criminalrecord!" client.Name

let tests =

[ { Check = testCriminal       | 创建记录值

Report= reportCriminal };   |

(* more tests...*) ]

代码首先创建一个记录类型,指定用函数类型,构成检查和报告部分。然后,创建两个函数,组合起来构成一个记录类型的值。使用函数的记录在概念上很简单,很容易将使用单独函数的代码,重构成使用记录的设计。如果我们要把这段代码改变成更加传统的 .NET 版本的话,可能不止一步。

我们前面提到过,函数类型类似于只有一个方法的接口。包含两个函数的记录,与有两个方法的接口非常相似,就毫不奇怪了。在 C# 中,我们几乎可以肯定使用接口来实现这种设计,F# 也可以这样做。

类似于成员,在创建健壮的应用程序,或可重复使用的 .NET 库时,接口更加重要。如果我们使用接口,不需要提供应该如何实现,因此,在写应用程序时,给我们很大的灵活性。在这一章的后面,我们将讨论在 F# 中实现接口的方法。开发能够从 C# 中调用的 .NET 库时,接口也非常有用。如果我们在 F# 中声明接口,C# 代码将把它看作是普通的接口。另一方面,带有函数作为成员的 F# 记录类型,看起来像有属性的类,有一些难以使用的类型。我们看一下如何能把记录类型改编成接口,但仍然以 F# 中自然的方式使用它。

时间: 2024-11-12 21:21:20

9.2.1 使用保存的函数记录的相关文章

PHP的一些 有用但不常用的函数记录

1. microtime() 当前 Unix 时间戳以及微秒数. <?php $mem = new Memcache; $mem->connect("127.0.0.1", 11211); $time_start = microtime_float(); //保存数据 for($i = 0; $i < 100000; $i ++){ $mem->set("key$i",$i,0,3); } $time_end = microtime_floa

eval函数记录

今天有个小程序想要在函数名列表中调用相应的函数处理,却怎么运行不了.初始代码如下: #coding:utf8 def h1(): print '函数1' def h2(): print '函数2' if __name__ == '__main__': list1 = ['h1','h2'] for name in list1: name() 其实这程序看起来就有点不对劲,最后查了查应该把最后的name上加上eval()函数 for name in list1: eval(name)() 这样才正

返回上一页时,保存恢复浏览记录(模拟返回不刷新)

sessionStorage: 与 localStorage 相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除.页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话.在新标签或窗口打开一个页面会初始化一个新的会话. 大致思路: 用户在点击新的链接时,保存上一页的信息(包括页码.滚轮位置.页面标识符等,建议保存于sessionStorage): 在打开上一页时先做判断,

Qt常用函数 记录(update erase repaint 的区别)

一界面重载函数使用方法:1在头文件里定义函数protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载void ----------::paintEvent(QPaintEvent *){//重载函数体} 执行条件:界面有任何变动都会执行特别:有时候会积累变化,既界面发生变化时不是立刻执行,可能几次变化合并为只执行一次.如果要立即执行需要调用函数详细使用见http://www.cnblogs.com/hnrainll/archive/2

MySql常用函数记录

一.MySQL 获得当前日期时间 函数 1.1 获得当前日期 + 时间(date + time) 函数:now() mysql> select now();+-------+| now() |+-------+| 2008-08-08 22:20:46 |+-------+ 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp()current_timestamplocaltime()localtimelocaltimestamp -

Python常用函数记录

Python常用函数/方法记录 一. Python的random模块: 导入模块: import random 1. random()方法: 如上如可知该函数返回一个[0,1)(左闭右开)的一个随机的浮点数. 若要控制范围为[min,max)可采用 min+(max-min)*random.random()如下所示,返回20~30之间的随机浮点数: 2. choice(seq)方法: 该方法从序列seq中返回一个随机的元素: 3. randint(a,b)方法: 该方法随机随机生成a~b之间的整

Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)

很久之前用过一次,后来就忘了...扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript.python.DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的用法. 一.概念介绍 intersection(_ :) 创建一个只包含两个公共值的新集合.(交集) symmetricDifference(_ :) 创建一个新集合,其值集在两个集合中,但不能同时存在.(非交集) union(_ :) 创建一个包含两个集合中的所有值的新集合.(合集) subtra

如何保存长Ping记录、普通域用户的runas用法(更新中)

1.长Ping并将结果记录到指定位置 ping 10.10.10.79 -t >>d:\2.txt 2.普通域用户安装软件 将软件拷贝到某个磁盘的根目录下(如D盘下) d: runas /user:administrator 软件名 输入管理员密码即可 3.普通域用户运行某个需要管理员权限的程序 runas /savecred /user:administrator "此软件的启动程序的安装目录" 只需输入一次管理员密码,后期直接运行不需要再次输入密码

phpccma常用函数记录

/** * 加载类文件函数 * @param string $classname 类名 * @param string $path 扩展地址 * @param intger $initialize 是否初始化 */ private static function _load_class($classname, $path = '', $initialize = 1) { //$path 为空则为 load_sys_class //$path 为'model'则为 load_model //$pa