F# 与另一个单位的数量建立度量单位关系

F# 与另一个单位的数量建立度量单位关系,f#,units-of-measurement,F#,Units Of Measurement,我知道你可以用单位的维度来表达关系,比如 []类型cc=cm^3 然后进行有意义的计算 给定某种度量单位类型 []类型m 是否可以在与另一个单位的数量的关系中定义一个单位?比如说, //不编译 []类型mm=0.001 //后来 让长度=500.0 设长度2=0.5 printfn“%A”(长度=长度2)//打印为真 简而言之:没有 度量单位是基元上的注释。时期您可能知道,它们将在编译过程中被删除 这是它们的基本限制:你不能给它们附加任何类型的功能,因为它们都会变成普通的旧式floats 编

我知道你可以用单位的维度来表达关系,比如

[]类型cc=cm^3
然后进行有意义的计算

给定某种度量单位类型

[]类型m
是否可以在与另一个单位的数量的关系中定义一个单位?比如说,

//不编译
[]类型mm=0.001
//后来
让长度=500.0
设长度2=0.5
printfn“%A”(长度=长度2)//打印为真
简而言之:没有

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

这是它们的基本限制:你不能给它们附加任何类型的功能,因为它们都会变成普通的旧式
float
s

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

您必须自己编写和使用这些函数,您所能做的最好的事情就是使它们尽可能简单明了

以下是我如何组织您的示例:

[<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
[]类型mm
[]类型mt
//首先,我喜欢定义基本函数来快速注释无量纲值
设mm=(*)1.0
设mt=(*)1.0
//我们定义一个常数转换
设MmPerMt=1000.0
//(尽管没有任何东西禁止我们定义我们想要的任何转换,并且编译器不能优先于其他转换)
让我在小学毕业=12345
//为了便于使用,我们将转换常数烘焙为函数
设MtToMm=(*)MmPerMt
//用法
让SomeUserInputMeters=“12414.23”
设DesiredValueInmm=SomeUserInputMeters
|>浮动
|>mt
|>MtToMm

这不是一个简单的方法,但您可以定义,比如说
mm
m
,然后定义一个类型安全转换函数。主要相关:无论如何,不会有隐含转换。在注释中,还有一些关于将
kilo
(或
milli
)作为单独计量单位的论点。