BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Pierre-Luc Maheu 关注 3 他的粉丝 ,译者 刘嘉洋 关注 0 他的粉丝 发布于 2016年4月2日. 估计阅读时间: 4 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

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)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT