与另一个单位的数量建立计量单位关系
Establish Units of Measure Relationships With a Quantity of Another Unit
我知道你可以用单位的维度来表达关系,比如
[<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
简而言之:没有
度量单位是基元上的注释。时期。正如您可能知道的那样,它们将在编译期间被删除。
所以这是它们的基本限制:你不能给它们附加任何类型的功能,因为它们都会变成普通的旧float
s。
编译器将检查您的表达式在维度上是否有效,但(目前)它不会自动生成或插入任何类型的 'default' 类型转换函数。
你必须自己编写和使用这些函数,你能做的最好的就是让它们尽可能简单。
以下是我组织示例的方式:
[<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
我知道你可以用单位的维度来表达关系,比如
[<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
简而言之:没有
度量单位是基元上的注释。时期。正如您可能知道的那样,它们将在编译期间被删除。
所以这是它们的基本限制:你不能给它们附加任何类型的功能,因为它们都会变成普通的旧float
s。
编译器将检查您的表达式在维度上是否有效,但(目前)它不会自动生成或插入任何类型的 'default' 类型转换函数。
你必须自己编写和使用这些函数,你能做的最好的就是让它们尽可能简单。
以下是我组织示例的方式:
[<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