gpt4 book ai didi

F# 测量单元 : from radians to velocity in m/s

转载 作者:行者123 更新时间:2023-12-01 00:41:26 26 4
gpt4 key购买 nike

假设我定义了一个 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 返回 float 。

我该如何解决这个问题?如果可能的话,我想在测量单位之间进行转换,而不是转换,这样编译器可以保证我在将角度转换为速度时做正确的事情。

有什么建议吗?

最佳答案

这里有几个问题:cos 需要一个无单位的值,因此您必须将单位从 angle 中去掉;考虑到速度需要 float 而不是 float32,您不妨直接转换为 float(这会删除单位)。

然后,您需要重新安装设备。在度量单位的第一个版本中,您可以通过在适当的度量中简单地乘以 1 来完成此操作。现在有 LanguagePrimitives.FloatWithMeasure,它更正确,但稍微更冗长。

let velocity =
{
X = angle |> float |> cos |> LanguagePrimitives.FloatWithMeasure<m/s> ;
Y = angle |> float |> sin |> LanguagePrimitives.FloatWithMeasure<m/s> ;
Z = 0.0<m/s> ;
}

除此之外,10 弧度是一个有趣的角度...

(注意 cossin 是内置的)

关于F# 测量单元 : from radians to velocity in m/s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8308414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com