F#中不同类型的NULL值

2009 年 6 月 05 日

之前有人认为 F#可以让我们从未经检验的 NULL 值中解放出来。然而,不仅事实上并非如此,而且它还引入了若干不同类型的 NULL 值。我们首先来研究一下在 C#代码中都普遍存在的问题。

复制代码
int GetLength(string value) { return value.Length; }

除非你打开代码分析并且该函数是公有函数,否则你只会得到一个该函数可能抛出 NullReferenceException 的警告。现在,让我们来分析一下等价的 F#代码。

复制代码
let GetLength (value : string) = a.Length

就像 C#版本那样,如果你意外地传给它一个 NULL 值,它就会抛出 NullReferenceException 异常。但和 C#不同的是,编译的时候你甚至不会收到一个警告。

接下来则是可为空的结构。测试代码先用 C#编写,接着是类似的 F#代码。

复制代码
static public bool IsPositive(int? value) { return value.Value > 0; }
let IsPositive( value : Nullable<int>) = value.Value > 0<br></br></int>

再者,两个版本都容易抛出异常。这里的异常是指 InvalidOperationException。

既然我们确定使用传统的类型与其它类型一样危险,那么我们转向新的可选类型。首先,我们使用"option"代替普通字符串来对 GetLength 进行重新编码。

复制代码
let GetLength2 (value : option<int>) = value.Value.Length<br></br></int>

现在我们就有可能得到两种不同异常。如果不给函数传入参数,就会得到一个 InvalidOperationException 异常。如果给该函数传入"某种类型的 NULL 值",就会得到 NullReferenceException。同样,不会有任何编译器警告提示你代码可能会出错。

F#也添加了三重 NULL 值的概念。因为你可以在可选类型中进行嵌套,所以能编写非常傻瓜化的函数,如下所示:

复制代码
let GetLength3 (value : option<string>) = value.Value.Value.Length<p>let IsPositive( value : option<int>) = value.Value.Value > 0<br></br></int></p></string>

在使用 F#类型来代替普通的 CLS 类型的时候,事情有所好转。F#中定义的类不能赋 NULL 值。然而,它们仍然可被封装到 option 类型,抛出 NULL 值安全提示并带我们到编译器发出问题警告的地方。

查看英文原文: The Many Types of Null in F#

2009 年 6 月 05 日 23:15539
用户头像

发布了 87 篇内容, 共 16.8 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

无接触,云办公!5天完成手机淘宝新版本迭代,揭秘阿里工程师协同研发“神器”

应用研发平台EMAS

厦门航空牵手阿里云打造航空业移动研发中台,研发效率提升50%

应用研发平台EMAS

手把手教你实现自定义Spring Boot的 Starter

java金融

Java spring 程序员 Spring Boot starte

LeetCode题解:70. 爬楼梯,DP遍历,变量缓存结果,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

ElasticSearch笔记

石印掌纹

什么样的服务器适合做APP?

德胜网络-阳

相聚“云”课堂,智微智能“双师课堂”促进优质教育资源共享

DT极客

BIGO 实时计算平台建设实践

Apache Flink

flink BIGO

设计模式

张明森

100% 展示 MySQL 语句执行的神器-Optimizer Trace

程序员历小冰

MySQL

week 9 作业

Geek_2e7dd7

两万字长文50+张趣图带你领悟网络编程的内功心法

arthinking

网络协议 TCP/IP

iOS身份证号码识别

高丰

week 9 学习总结

Geek_2e7dd7

企业玩转DevOps转型:由弱到强,只需7步

华为云开发者社区

DevOps 软件工程 组织转型 软件开发 华为云

阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能

应用研发平台EMAS

LG的“卷轴”柔性屏,技术可期,前景未卜?

脑极体

区块链标准化很重要吗?

CECBC区块链专委会

区块链 区块链规范

计算机网络基础(十二)---网络层-外部网关路由协议

书旅

计算机网络 网络 协议栈 BGP

JVM系列之:JIT中的Virtual Call接口

程序那些事

Java JVM JIT

你不是说你会Aop吗?

Java旅途

击破技术枷锁与认知迷雾 百度四大杀手锏开启新基建AI风暴

脑极体

阿里云小程序云发布小程序跨平台开发框架,助力开发者一次开发,多端运行

应用研发平台EMAS

简述 JVM 垃圾回收原理

一叶知秋

redis-port支持前缀迁移

心平气和

redis redis-port

聚焦智慧城市生活服务,百度携手贝塔智能按下“加速键”

百度大脑

人工智能 人脸识别 AR 百度大脑 智慧城市

多线程 & 并发架构

石印掌纹

汇付天下与阿里云合作打造企业级移动中台,运营效率提升100%

应用研发平台EMAS

全国首个市场监管区块链电子取证平台正式上线

CECBC区块链专委会

区块链

分布式环境下,我想要一致性

架构师修行之路

分布式 分布式系统 架构师 CAP

ARTS-WEEK9

一周思进

F#中不同类型的NULL值-InfoQ