红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

使用 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:00810
用户头像

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

关注

评论

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

极盾故事|某头部私募基金“扩展检测响应XDR平台”建设

极盾科技

XDR扩展威胁检测响应

NFTScan 获 Optimism 基金会 Cycle 14 Grant 支持 35,000 枚 OP !

NFT Research

NFT\ NFTScan

百度Comate代码助手全新上线SaaS服务,适配百种开发语言,编码效率10倍提升!

新消费日报

mac电脑智能视频画质修复软件 Topaz Video AI最新激活版

胖墩儿不胖y

Mac软件 视频修复工具

北控水务集团:通过财务共享打造高效智能的集团决策与管控中心

用友BIP

财务共享

Dapp公链NFT模式系统开发丨区块链技术部署

V\TG【ch3nguang】

社区迭代|ETLCloud社区新增“论坛”啦!

RestCloud

ETL 社区 论坛

Dubbo 路由及负载均衡性能优化

vivo互联网技术

负载均衡 dubbo 路由

高效集成|这一次,快人一步

RestCloud

ETL

如何查询外贸网站是否被Google收录?

九凌网络

Generative AI 新世界 | Falcon 40B 开源大模型的部署方式分析

亚马逊云科技 (Amazon Web Services)

Python 机器学习 容器 ;开源 生成式人工智能

分投趣FINTOCH矿池质押挖矿系统模式开发规则解析

V\TG【ch3nguang】

携程商旅发布“全球影响力计划”

携程商旅

嵌入式框架设计中的四种常用模式

互联网工科生

嵌入式

10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势

墨天轮

数据库 oracle postgresql opengauss 国产数据库

专家观点∣数智化招聘如何打破冶金企业人才困境

用友BIP

人才 数智化招聘

谷歌优化没头绪,关注这两个重要指标!

九凌网络

外贸网站收录的概念与网站不收录原因

九凌网络

Ableton Live 11 Suite for Mac(音乐制作软件) v11.3.13完美激活版

mac

苹果mac Windows软件 Ableton Live 11 数字音频软件 Live 11

mac优秀英语学习工具 Eudic欧路词典最新中文版

mac大玩家j

Mac软件 英语词典工具 英语学习软件

九凌网络分享做谷歌seo优化,技术主要在做什么?

九凌网络

语音识别技术在智能家居领域的应用与前景

来自四九城儿

Java基础面试题【Spring、Spring MVC、Spring Boot】进阶篇

派大星

Java 面试题

一文详解多模态大模型发展及高频因子计算加速GPU算力 | 英伟达显卡被限,华为如何力挽狂澜?

蓝海大脑GPU

谷歌SEO的含义:如何实现SEO策略和技巧?

九凌网络

Money Pro for mac(综合性个人记账理财工具) 2.9.5中文激活版

mac

苹果mac Windows软件 Money Pro 理财工具

DAPP 区块链流动性质押挖矿系统开发丨 DAPP 公链挖矿开发

V\TG【ch3nguang】

QA忙不过来怎么破?

BY林子

软件测试 QA

飞码LowCode前端技术系列(二):如何便捷配置出页面 | 京东云技术团队

京东科技开发者

前端 低代码 低代码平台 企业号10月PK榜

「智造」第2期:智能制造应用下工业互联网平台的业务价值

用友BIP

智能制造

DeepSpeed: 大模型训练框架 | 京东云技术团队

京东科技开发者

人工智能 大模型 DeepSpeed 企业号10月PK榜

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