如何对付运行时可能为 null 的 Record Type
在 F# 中,Record Type 是无法表达 null
语义的,例如,一个 Record 变量不能够使用 null
字面量赋值,接收 nullable(这里并不是指 BCL 中的 Nullable<T>
类型,而是指 C# 8.0 之前的引用类型)作为参数的函数不能使用 Record 作为参数:
type Foo = {Id: string}
let foo: Foo = null // 编译错误
let foo = {Id: "2333"} // 编译通过
let fooOp = Option.ofObj foo // 编译错误
F# 的设计者可能认为 Record 作为一个典型的函数式语言特性,使用 option 来表达 nullable 会更加 Functional,所以就禁止了 Record 与 null
的直接转换。这种愿景非常美好,但是实际上大部分的 .Net 生态环境都是使用 C# 来构建的,比如 Linq。下面的一段代码就会在 F# 中引发可怕的“空引用异常”:
open System.Linq
let foos: Foo list = []
let nill = foos.FirstOrDefault()
//> let nill: Foo
prinrf "%A" nill.Id //<-- 空引用异常
可以看到,FirstOrDefault
的返回值尽管是 Foo
类型,但是在运行时其结果永远都是 null
,又因为 F# 禁止了 Record 与 null
相关的比较操作,所以此处无法直接进行判断结果是否为 null
。
我采用的做法就是进行类型转换,首先将 Record 类型转换成 obj
,然后判断此处的引用是否为 null
:
module Option
let ofRecord r =
match box r with
| null -> None
| _ -> Some r
因为 F# 中的 Record 类型底层就是使用引用类型来实现的,所以这里并不会产生真正的装箱操作,对性能的影响并不会太大。
如何对付运行时可能为 null 的 Record Type的更多相关文章
- Spring注解运行时抛出null
关于Spring的注解其实不难,大致需要以下几个流程: 一.配置Spring的注解支持 <?xml version="1.0" encoding="UTF-8&qu ...
- 使用dynamic引发的异常:无法对 null 引用执行运行时绑定
今天上午运营反映有商户的账单没有生成. 查看日志,在批量生成账单服务执行过程中,因为如下异常而中断了: 跑批异常 Microsoft.CSharp.RuntimeBinder.RuntimeBinde ...
- java--何时处理Exception(哪一个层级),包装的基础类处理任务尽可能简洁,写入日志,检查null等运行时异常
1. 运行时异常和受检异常 2. 提前预防运行时异常.最常发生的是NPE,而检查NPE是程序员的基本职责.其他的,如除0等运行时异常的检查,需要程序员仔细检查,每个函数都得检查(除非可以确定不会有空指 ...
- [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切
Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
- Android中Activity运行时屏幕方向与显示方式详解
现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- ObjC运行时部分概念解析(一)
转型iOS已经许久了,Runtime(运行时)还没有好好了解过.之前没有阅读过源码,紧紧凭借自己的臆测.现在阅读下源码,做一些笔记.方便再次翻阅 SEL SEL是一个关键字,如果没有涉及runtime ...
- 自定义注解之运行时注解(RetentionPolicy.RUNTIME)
对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成clas ...
随机推荐
- file 上传大小限制问题
今天突然传了一张很大的图片 结果怎么传都获取不到信息(如下); 最后查看了下php.ini 中的 " upload_max_filesize "最大只允许了2M! 改下就可以 ...
- __LINE__的用法
简单的说,__LINE__可以获取当前代码的函数,结合__FUNCTION__可以打印调试信息,比如函数出错时运行的函数名,及行号,例如 #define p_err_fun , os_time_get ...
- _ZNote_Mac_技巧_QuickLook功能扩展
QuicLook(快速查看)是macOS一项非常方便的独有功能: 当选中一个文件,只需要按下空格键即可查看其内容,在按下空格退出QuickLook, 不需要启动再关闭任何软件. 默认支持大部分视频.音 ...
- python 在unix下json格式显示结果
在使用命令号输出接口测试结果,发现无法按照期望的json格式进行显示.查阅资料发现python自带强大的工具. 直接上代码: import os,requests url = XXXXXX conte ...
- C程序编程规范一
和身边一些学弟们接触发现他们的编程习惯不是太好,对一些基本的规范不重视,今天有时间写一些基本的规范给一些刚入门的新手们,高手可忽略. 首先做项目来说需要建立工程,一般需要几个到几百个上上千个C文件,这 ...
- ASP.NET MVC下使用AngularJs语言(三):ng-options
今天使用angularjs的ng-options实现一个DropDownList下拉列表. 准备ASP.NET MVC的model: public class MobilePhone { public ...
- eclipse——JDK安装与环境变量配置步骤
第一次接触eclipse的时候,让我自己安装jdk和配置环境变量,我是懵逼的,后来百度到找到了一个比较详细的引导,本人测试没问题,截图按步骤如下: JDK安装 步骤1: 步骤2: 配置环境变量 步 ...
- PHP-1安装配置
php-fpm启动 /usr/local/php/sbin/php-fpm start
- Setting Up Swagger 2 with a Spring REST API
Last modified: August 30, 2016 REST, SPRING by baeldung If you're new here, join the next webinar: & ...
- Linux 定位网络不通问题
[参考文章]:ping命令入门详解 1. ipconfig / ifconfig 1. 作用: 检查本地的网络配置是否正确 2. ping 1. 作用: 一个十分好用的TCP/IP工具.它主要的功能是 ...