与另一单位数量建立计量单位关系

jdp*_*nix 3 f# units-of-measurement

我意识到你可以表达与单位维度的关系,比如

[<Measure>] type cc = cm^3
Run Code Online (Sandbox Code Playgroud)

然后进行有意义的计算.

给定一些度量单位类型,

[<Measure>] type m
Run Code Online (Sandbox Code Playgroud)

是否可以在与另一个单位数量的关系中定义一个单位?例如,

// doesn't compile
[<Measure>] type mm = 0.001<m>

// later
let length = 500.0<mm>
let length2 = 0.5<m>
printfn "%A" (length = length2) // prints true
Run Code Online (Sandbox Code Playgroud)

pia*_*ste 7

简而言之:没有.

度量单位是基元的注释.期.您可能知道,它们将在编译期间被删除.

所以这是他们的基本限制:你不能为他们附加任何类型的功能,因为他们都会变成普通的老人float.

编译器将检查您的表达式是否在尺寸上有效,但(现在)它不会自动生成或插入任何类型的"默认"类型转换函数.

您必须自己编写和使用这些功能,而您所能做的最好的事情就是尽可能地使它们变得简单.

以下是我组织你的例子的方法:

[<Measure>] type mm    
[<Measure>] type mt

// first, I like to define basic functions to quickly annotate dimensionless values
let mm = (*) 1.0<mm>
let mt = (*) 1.0<mt>

// we define a constant conversion
let MmPerMt = 1000.0<mm/mt>

// (though nothing forbids us from defining any conversion we want, and the compiler cannot privilege one over another)
let INeverPaidAttentionInGradeSchool = 12345<mm/mt>

// for ease of use, we bake the conversion constant into functions
let MtToMm = (*) MmPerMt

// usage
let someUserInputInMeters = "12414.23"

let desiredValueInMillimeters = someUserInputInMeters
                                |> float
                                |> mt
                                |> MtToMm
Run Code Online (Sandbox Code Playgroud)