写点什么

使用 F#中的度量单位保障数据类型安全

  • 2016-04-01
  • 本文字数:1027 字

    阅读完需:约 3 分钟

F#中的度量单位使得给基本数据类型添加类型信息变为可能。这将会降低单位不匹配的可能性,增加更多的安全性,例如在预期单位为毫秒的情况下调用秒。虽然可以使用类来处理度量单位不匹配,在语言中直接内置功能可以使代码变得更加简洁。

F#中的度量单位可用来给任何与其他类型相关的值,增加类型安全性。以下的代码展示了不同类型值的计算:

复制代码
[<Measure>] type dollar
[<Measure>] type pound
[<Measure>] type hour
[<Measure>] type week
[<Measure>] type year
let hoursBilledPerWeek = 32.0<hour/week>
let weeksWorkedPerYear = 47.0<week/year>
let dollarsPerHour = 100.0<dollar/hour>
let exchangeRate = 1.45<dollar/pound>
let poundsPerYear = dollarsPerHour * hoursBilledPerWeek * weeksWorkedPerYear / exchangeRate
// the value and type of poundsPerYear is: float<pound/year> = 103724.1379

一些 APIs 也可以受益于度量单位。它可以隔离一些类型的错误,例如将错误的度量单位作为参数传递。例如说 Thread.Sleep(10) 这个例子中,函数接收了一个整型参数,这个单元在之前的代码中进行过定义。使用度量单位,方法被封装之后就能提供更严密的 API:

复制代码
let sleep (time : int<ms>) = Thread.Sleep(time / 1<ms>)
sleep 10<ms>

由于上面所定义的是毫秒单位,所以调用 10 秒 sleep 就会发生编译错误:

复制代码
Error Type mismatch. Expecting a
int<ms>
but given a
int<s>

时间的单位经常需要转换。在一个公式内使用乘除法就可以完成转换。转换可以使用静态成员完成,如下面的代码所示:

复制代码
[<Measure>] type ft
[<Measure>] type inch = static member perFoot = 12.0<inch/ft>
let inches = 1.0<ft> * inch.perFoot;

处理物理问题的应用程序会需要表示一些复杂的单位,比如说牛顿。下面的例子展示了如何使用复合度量单位,组合几个简单的单位:

复制代码
let distance = 1.0<m>
let time = 2.0<sec>
let speed = 2.0<m/sec>
let acceleration = 2.0<m/sec^2>
let force = 5.0<kg m/sec^2>

需要附加说明的是,F#的度量单位不能作为公共 API 在其他.NET 语言,例如 C#中调用。这是因为度量单位不在 CLR 中,它们是作为语言结构被存储在程序集元数据中的。

查看英文原文 Type Satety for Numerics in F# Using Units of Measure


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-01 19:00845
用户头像

发布了 218 篇内容, 共 65.6 次阅读, 收获喜欢 76 次。

关注

评论

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

FL Studio21最新版编曲DJ舞曲制作软件

茶色酒

FL Studio FL Studio 21

云原生系列 二【轻松入门容器基础操作】

叶秋学长

云原生 华为云 沙箱实验 11月月更

微服务连接:Subset子集划分算法

董哥的黑板报

微服务 云原生 连接 RPC 集群

OSPF高级配置——虚链路介绍与配置

我叫于豆豆吖.

11月月更

【愚公系列】2022年11月 微信小程序-sitemap站内搜索

愚公搬代码

11月月更

Redis分布式锁剖析和几种客户端的实现

C++后台开发

redis 分布式 后端开发 C++开发

ABBYY FineReader16最新版PDF编辑器功能介绍

茶色酒

abbyy

算法题学习---链表的奇偶重排

桑榆

算法题 11月月更

有限状态机

芯动大师

Verilog 11月月更 Melay FSM

架构误区系列5:滥用分布式锁

agnostic

分布式锁

网页基本代码

我叫于豆豆吖.

11月月更

2022-11-19:第二高的薪水。表结构和数据的sql语句如下,输出200,因为200是第二大的。请问sql语句如何写? DROP TABLE IF EXISTS `employee`; CREAT

福大大架构师每日一题

MySQL 数据库 福大大

API渗透测试4个关键步骤

阿泽🧸

11月月更 API渗透测试

LeetCode题解:783. 二叉搜索树节点最小距离,栈,JavaScript,详细注释

Lee Chen

JavaScript 算法 LeetCode

聊聊香港优才-续篇(58/100)

hackstoic

香港优才

OSPF路由协议三

初学者

网络 11月月更

精选2022年大厂高频Java面试真题集锦(含答案),面试一路开挂

程序知音

java面试 大厂面试 java架构 后端技术 Java面试八股文

架构实战营模块 5 作业

陌生流云

架构实战营

一篇文章彻底理解 HDFS 的安全模式

明哥的IT随笔

hadoop hdfs

TCC

急需上岸的小谢

11月月更

代码的衡量标准

Lemoon Can

写好代码 好代码的衡量标准

Camtasia2023免费电脑录屏视频软件使用教程

茶色酒

Camtasia Camtasia2023

网站与应用

我叫于豆豆吖.

11月月更

python中封装和继承

乔乔

11月月更

FL Studio水果软件V21完整版本全面升级支持简体中文语言界面

茶色酒

FL Studio 水果FL Studio FL Studio 21

EasyExcel导出数据超过Excel单表上限解决方案

@下一站

大数据 技术 Excel Java core 11月月更

数据预处理和特征工程-特征选择-相关性过滤-互信息法 & F检验

烧灯续昼2002

人工智能 机器学习 算法 特征工程 11月月更

CorelDraw2023主要功能特性

茶色酒

CorelDraw2023 CorelDraw

Scrum Patterns:产品的自豪感(Product Pride)

Bruce Talk

Scrum 敏捷 Agile Scrum Patterns

cap理论和base理论

急需上岸的小谢

11月月更

两阶段提交与三阶段提交

急需上岸的小谢

11月月更

使用F#中的度量单位保障数据类型安全_.NET_Pierre-Luc Maheu_InfoQ精选文章