假设我已经定义了一个 F# 模块来处理 3 维向量和测量单位:
[<Measure>]
type m
[<Measure>]
type s
[<Measure>]
type v = m/s
[<Measure>]
type rad
type Vector3<[<Measure>] 'a> =
{
X : float<'a>
Y : float<'a>
Z : float<'a>
}
在某处我有一个以弧度表示的角度:
let angle:float32<rad> = 0.5f<rad>
现在我必须使用角度来声明一个 Vector3(速度)来计算它的分量。我尝试了类似的东西:
let velocity : Vector3<m/s> = { X = Math.Cos(angle);Y = Math.Sin(angle);Z = 0.0<m/s>} //don't compile
上面的代码无法编译,因为 Vector3 期望 X 和 Y 中的值,但 Sin 返回一个浮点数。
我怎么解决这个问题?如果可能的话,我想在测量单位之间执行转换,而不是强制转换,这样编译器可以保证我在将角度转换为速度的同时做正确的事情。
有什么建议吗?