F# 如何将一个度量定义为另一个度量的倍数

F# 如何将一个度量定义为另一个度量的倍数,f#,F#,我试图将Isaron定义为一个鸡蛋的43.2倍,但我得到了一个例外: [<Measure>] type Egg [<Measure>] type Isaron = (43.2)*(Egg) 错误FS0618:类型中的文本无效 如何正确定义此度量值?如果不在度量值类型中定义关系,则在转换为类型或从类型转换为关系的函数中定义: [<Measure>] type Egg [<Measure>] type Isaron let toEgg (i : fl

我试图将Isaron定义为一个鸡蛋的43.2倍,但我得到了一个例外:

[<Measure>] type Egg
[<Measure>] type Isaron = (43.2)*(Egg)
错误FS0618:类型中的文本无效


如何正确定义此度量值?

如果不在度量值类型中定义关系,则在转换为类型或从类型转换为关系的函数中定义:

[<Measure>] type Egg
[<Measure>] type Isaron
let toEgg (i : float<Isaron>) = i / 43.2<Isaron> * 1.0<Egg>
let toIsaron (e : float<Egg>) = e / 1.0<Egg> * 43.2<Isaron>
有另一个示例说明如何通过创建恒定的转换系数以英尺和英寸为单位进行转换:

[<Measure>] type Egg
[<Measure>] type Isaron
let isaronsPerEgg = 43.2<Isaron/Egg>
let toEgg (i : float<Isaron>) = i / isaronsPerEgg
let toIsaron (e : float<Egg>) = e * isaronsPerEgg

您不在度量值类型中定义关系,而是在转换为类型或从类型转换为类型的函数中定义关系:

[<Measure>] type Egg
[<Measure>] type Isaron
let toEgg (i : float<Isaron>) = i / 43.2<Isaron> * 1.0<Egg>
let toIsaron (e : float<Egg>) = e / 1.0<Egg> * 43.2<Isaron>
有另一个示例说明如何通过创建恒定的转换系数以英尺和英寸为单位进行转换:

[<Measure>] type Egg
[<Measure>] type Isaron
let isaronsPerEgg = 43.2<Isaron/Egg>
let toEgg (i : float<Isaron>) = i / isaronsPerEgg
let toIsaron (e : float<Egg>) = e * isaronsPerEgg

可以在类型本身中定义计量单位类型之间的关系;乘法、除法和指数运算都很好。系数是不可能的。提夫德夫提出了一个很好的观点。如果你跟随我的链接到Scott Wlaschin的站点,你会看到一个速度声明为2.0,其中m和sec是之前定义的两个独立的度量单位,而力声明为5.0。kg m/sec^2在正确的科学记数法中是kg-m/s^2,但F使用空格而不是连字符表示乘法单位,以避免任何歧义,因为这不是减法。实际上,我的意思仍然是:您可以用另一种形式定义UoM类型本身:[]类型m;[]类型sqm=m^2参数和结果的推断类型将始终为m^2,但只要您自己指定类型,sqm就可以用作类型别名。@TeaDrivenDev另一个示例:[]类型N=kg*m*sec^-2。这就是你的意思吗?当然,让力=5.0和让力=5.0是一样的。但如果乘以秒^2,除以千克,则得到的是N秒^2/kg,而不是m。您可以在类型本身中定义计量单位类型之间的关系;乘法、除法和指数运算都很好。系数是不可能的。提夫德夫提出了一个很好的观点。如果你跟随我的链接到Scott Wlaschin的站点,你会看到一个速度声明为2.0,其中m和sec是之前定义的两个独立的度量单位,而力声明为5.0。kg m/sec^2在正确的科学记数法中是kg-m/s^2,但F使用空格而不是连字符表示乘法单位,以避免任何歧义,因为这不是减法。实际上,我的意思仍然是:您可以用另一种形式定义UoM类型本身:[]类型m;[]类型sqm=m^2参数和结果的推断类型将始终为m^2,但只要您自己指定类型,sqm就可以用作类型别名。@TeaDrivenDev另一个示例:[]类型N=kg*m*sec^-2。这就是你的意思吗?当然,让力=5.0和让力=5.0是一样的。但是如果你乘以秒2,除以千克,你得到的是N秒2,而不是m。