【问题标题】:Establish Units of Measure Relationships With a Quantity of Another Unit与另一个单位的数量建立计量单位关系
【发布时间】:2016-01-06 20:17:21
【问题描述】:

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

[<Measure>] type cc = cm^3

并在以后执行有意义的计算。

给定一些度量单位类型,

[<Measure>] type m

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

// 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

【问题讨论】:

  • 不是一个简单的方法,但你可以定义 mmm 然后一个类型安全的转换函数。
  • 大相关:stackoverflow.com/questions/13822066/…反正不会有隐含转换。在 cmets 中,也有一些关于 kilo(或 milli)作为单独计量单位的争论。

标签: f# units-of-measurement


【解决方案1】:

简而言之:没有。

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

所以这是它们的基本限制:您不能附加任何类型的功能到它们,因为它们都会变成普通的旧floats。

编译器将检查您的表达式在维度上是否有效,但(目前)它不会自动生成或插入任何类型的“默认”类型转换函数。

你必须自己编写和使用这些函数,你能做的最好的就是让它们尽可能简单。

我会这样组织你的例子:

[<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

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2017-12-11
    • 1970-01-01
    • 2019-05-07
    • 2019-06-10
    • 1970-01-01
    • 2016-06-11
    • 2010-09-11
    • 2018-03-25
    相关资源
    最近更新 更多