如果我们定义一个测量单位,例如:
[<Measure>] type s
然后是带有度量的整数
let t = 1<s>
然后将其转换为浮点数
let r = float t
我们看到r = 1.0
没有测量类型。这看起来很奇怪,因为所有测量信息都丢失了。
您可以使用LanguagePrimitives.FloatWithMeasure
用类似的东西转换回浮点数
let inline floatMeasure (arg:int<'t>) : (float<'t>) =
LanguagePrimitives.FloatWithMeasure (float arg)
它强制执行正确的类型,但这感觉不像度量单位的文档(http://msdn.microsoft.com/en-us/library/dd233243.aspx)所说的正确解决方案
但是,为了编写互操作性层,还可以使用一些显式函数将无单位值转换为有单位值。这些位于 Microsoft.FSharp.Core.LanguagePrimitives 模块中。例如,要将无单位浮点数转换为浮点数,请使用 FloatWithMeasure,如以下代码所示。
这似乎表明在 F# 代码中应避免使用该函数。
有没有更惯用的方法来做到这一点?
这是工作片段,它完全满足您的需要,但会发出警告
stdin(9,48):警告 FS0042:此构造已弃用:它仅适用于 F# 库)):
[<NoDynamicInvocation>]
let inline convert (t: int<'u>) : float<'u> = (# "" t : 'U #)
[<Measure>] type s
let t = 1<s>
let t1 = convert t // t1: float<s>
但是,我不建议采用这种方法。
首先,UoM是编译时的,而类型转换的let r = float t
是运行时。在调用的那一刻,int -> float
不知道是否是int<s>
or int<something_else>
。所以根本无法推断出正确的float<'u>
在运行时.
另一种想法是,曼彻斯特大学背后的哲学比它所描述的更广泛。这就像对编译器说:“嗯,它是int
,但请将其视为int<s>
“。目标是避免偶尔的不当使用(例如,添加int<s>
to int<hours>
).
有时它毫无意义int -> float
换算:想到int<ticks>
,没有任何感觉float<ticks>
.
进一步阅读,感谢 @kvb 指出本文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)