11.3.4.1 实现或和延迟或

因为我们要实现运算符,需要将其定义为真正的运算符,而不只是通常的函数。就像在第六章学过的,可以在 F# 中引入自己的运算符,清单 11.17 显示了两种不同的或运算符。

[

清单序号还有问题。从 11.14 开始,就变成了 11.17 了。

]

清单 11.17 比较提前和延迟的或运算符 (F# Interactive)


let (||!) a b =     [1]

if a then true

elif b then true

else false

// Using in F# Interactive

> if (foo(5) ||! foo(7))    [3]

then printfn "True";;

foo(5)

foo(7)

True


let (||?) (a:Lazy<_>) (b:Lazy<_>) =

if a.Value then true    [2]

elif b.Value then true

else false

> if lazy foo(5) ||? lazy foo(7)    [4]

then printfn "True";;

foo(5)

True

提前运算符版本的参数值是布尔值[1],因此,可以直接在 if 条件中使用;而延迟版本的参数是把返回布尔值的计算,打包成延迟值,因此,要读取值,需要使用 Value 属性[2]。

使用提前版的运算符时[3],只要正常参数值。从输出可以看到,两个参数值都已经计算了。事实上,它们是在我们自定义运算符的主体执行之前就计算了。当使用延迟版时[4],我们加上了额外的 lazy 关键字,以延迟两个参数值。结果只有一个表达式进行了计算,因为这对于最终结果的计算已经足够了。

这个示例在很多方面有点奇怪,但对于演示如何以编程方式,通过语言构造实现我们所熟悉元素的延迟,是非常有用的。下一步我们将延迟值实现为类型,能够从 C# 中使用。在语法结构上不是很紧凑,但即使是这样,依然很有用。

时间: 2024-11-09 00:29:43

11.3.4.1 实现或和延迟或的相关文章

延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?

开篇: 正如<Effective Java>第二版中第71条目“慎用延迟初始化”所说: 大多数的域应该正常的被初始化而不是延迟初始化.如果为了达到性能目标,或者为了破坏有害的初始化循环,而必须延迟初始化一个域,就可以使用相应的延迟初始化方法. 对于实例域,就使用双重检查模式(double-check idiom):对于静态域,则使用 lazy initialization hodler class idiom. 对于可以接受重复初始化的实例域,也可以考虑使用单检查模式(single-check

自己动手写CPU之第八阶段(4)——转移指令实现过程2

将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20 8.4.3 修改执行阶段的EX 模块 参考图8-6可知,EX模块需要增加一些接口,增加的接口描述如表8-4所示. EX模块的代码主要修改如下,完整代码请参考本书附带光盘Code\C

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

Android API Guides---Sensors Overview

Sensors Overview 大多数Android手机都内置了用于测量运动,方向和各种环境条件的传感器.这些传感器能够提供原始数据具有较高的精度和准确度的,如果你想监控三维设备移动或定位是有用的,或者你想要监控的设备附近周围环境的变化.例如,一个游戏可以跟踪从设备的重力传感器读数来推测复杂的用户手势和动作,比如倾斜,摇动,旋转或摇摆.同样,天气应用程序可以使用设备的温度传感器和湿度传感器计算和报告露点或旅游应用程序可能使用的地磁传感器和加速度计报告罗盘方位. Android平台支持的传感器三

百科知识 什么是WP7

Windows Phone 7 windows phone 7待机界面 Windows Phone 7是微软发布手机操作系统.据国外媒体报道,微软公司首席执行官史蒂夫-鲍尔默北京时间2月15日在全球移动通信大展上发布了公司最新一代手机操作系统,Windows Phone 7. 微软称,公司将通过最新一代手机操作系统Windows Phone 7,将旗下Xbox LIVE游戏.Zune音乐与独特的视频体验整合至手机中.2010年10月11日晚上9点30分,微软公司正式发布了智能手机操作系统Wind

【SSH】---【Struts2、Hibernate5、Spring4】【散点知识】

一.Struts21.1.Struts2的概念Struts2是一个用来开发MVC应用程序的框架,它提供了Web应用程序开发过程中的一些常见问题的解决方案:    ->对来自用户的输入数据进行合法性验证:?    ->统一的布局:?    ->可扩展性:?    ->国际化和本地化:?    ->支持Ajax?    ->表单的重复提交?    ->文件的上传下载(文件上传中文件的类型不是普通类型,而是多媒体数据类型[*.txt.*.doc.*.xls等],由于表单

高性能浏览器网络(High Performance Browser Networking) 第一章

译者注:本文是<High Performance Browser Networking>的翻译版,采用google translator tookit工具翻译,原文很多格式丢失,后续还需要统一整理. 原文请参考:http://chimera.labs.oreilly.com/books/1230000000545/ch01.html 第一章 延迟和带宽的基本概念 速度是一个特性 过去几年内,Web性能优化(WPO)作为一个新的行业快速增长,成为用户追求更高的速度和更快的用户体验的一个明显标志.

Swift语法注意点(一)

1.字符.字符串也能使用区间运算符,但是不能用在for-in中: 2.函数中形参是let,也只能是let 3.一个函数最多只能有1个可变参数 4.紧跟在可变参数后边的参数不能省略参数标签 5.可变参数不能标记为inout 6.inout参数不能有默认值,并且inout参数传入的必须是可以被多次赋值的 7.原始值不占用枚举变量的内存 8.自动闭包@autoclosure只支持()->T格式的参数 9.lazy属性只能是var,不能是let,let必须在实例化方法完成之前就拥有值 10.如果多条线程

Python入门基础01

计算机基础扫盲 1.什么是编程语言?什么是语言?为何要用编程语言? 编程语言的本质就是一门语言,Python就是一门编程语言 语言就是一种事物与另外一种事物沟通的表达方式/工具 编程就是人把自己的思维逻辑,用编程语言表达出来 编程的目的就是让计算机按照人类的思维逻辑去工作,从而解放人力 2.计算机的世界里有几种角色? 人--------------编程语言-------------计算机 3.计算机五大组成部分 4.软件的运行与三大核心硬件的关系 程序最先是存放于硬盘中的 程序的运行一定是先把程