F# 向量与F中的度量单位相乘#
我写了以下内容F# 向量与F中的度量单位相乘#,f#,vector,measure,F#,Vector,Measure,我写了以下内容 [<Measure>] type m [<Measure>] type s [<Measure>] type v = m/s type Vector3<[<Measure>] 'a> = { X : float<'a> Y : float<'a> Z : float<'a> } static member (*) (
[<Measure>]
type m
[<Measure>]
type s
[<Measure>]
type v = m/s
type Vector3<[<Measure>] 'a> =
{
X : float<'a>
Y : float<'a>
Z : float<'a>
}
static member (*)
(v:Vector3<'a>,f:float<'b>):Vector3<'a*'b> =
{ X = v.X*f; Y = v.Y*f ; Z = v.Z * f}
[]
m型
[]
s型
[]
v型=米/秒
类型向量3
Y:浮子
}
静态成员(*)
(v:Vector3):Vector3=
{X=v.X*f;Y=v.Y*f;Z=v.Z*f}
现在我试着这样使用它:
let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> -> Vector3<m>) =
position + (velocity * dt)
let next_pos(位置:Vector3,速度:Vector3,dt:float->Vector3)=
位置+(速度*dt)
它给了我一个编译器错误,但我很确定度量单位的表达是正确的。
我的错误是什么?我这样解决了(但我不确定原因)
let next_pos(位置:Vector3,速度:Vector3,dt:float)=
位置+(速度*dt)
如果我明确定义返回类型,编译器似乎会失败。如果我删除它似乎能够推断出正确的类型。
但为什么会这样
除此之外,类型声明中的名称冲突也会迫使我明确指定返回类型。因此,我认为这最终不是正确的解决方案。我用这种方式解决了问题(但我不确定原因)
let next_pos(位置:Vector3,速度:Vector3,dt:float)=
位置+(速度*dt)
如果我明确定义返回类型,编译器似乎会失败。如果我删除它似乎能够推断出正确的类型。
但为什么会这样
除此之外,类型声明中的名称冲突也会迫使我明确指定返回类型。因此,我认为这最终不是正确的解决方案。您试图用于指定返回类型的语法不正确。应该是这样的:
let next_pos (position:Vector3<m>, velocity:Vector3<m/s>, dt:float<s>) : Vector3<m> =
position + (velocity * dt)
让下一个位置(位置:Vector3,速度:Vector3,dt:float):Vector3=
位置+(速度*dt)
要指定函数返回类型为Vector3
的值,需要向结果中添加类型注释,这是通过写入let foo:T=
完成的。在向参数添加类型注释时,这些注释需要加括号(这样语法就不会模棱两可)。正如Paolo在一篇评论中指出的,您使用的->
表示dt
是一个函数,因为注释float->Vector3
附加到参数dt
为了使代码能够编译,我还必须将
(+)
运算符的实现添加到Vector3
,但我假设您已经有了它(并且在发布问题时忽略了它)。您尝试用于指定返回类型的语法不正确。应该是这样的:
let next_pos (position:Vector3<m>, velocity:Vector3<m/s>, dt:float<s>) : Vector3<m> =
position + (velocity * dt)
让下一个位置(位置:Vector3,速度:Vector3,dt:float):Vector3=
位置+(速度*dt)
要指定函数返回类型为Vector3
的值,需要向结果中添加类型注释,这是通过写入let foo:T=
完成的。在向参数添加类型注释时,这些注释需要加括号(这样语法就不会模棱两可)。正如Paolo在一篇评论中指出的,您使用的->
表示dt
是一个函数,因为注释float->Vector3
附加到参数dt
为了使代码能够编译,我还必须将
(+)
操作符的实现添加到您的向量3
,但我假设您已经有了它(并且在发布问题时忽略了它)。您的度量单位对我来说不合适。使用(velocity*dt)将速度(m/s)乘以返回类型dt,单位为米(m)。结果是m^2/s,而不是你想要的m。请注意,你也可以让编译器推断出一个更一般的类型:让nextpos(v:Vector3,v':Vector3,dv)=v+v'*dv
我觉得你的度量单位不对。使用(velocity*dt)将速度(m/s)乘以返回类型dt,单位为米(m)。结果是m^2/s,而不是你想要的m。请注意,你也可以让编译器推断出一个更一般的类型:让nextpos(v:Vector3,v':Vector3,dv)=v+v'*dv
事实上,现在你已经将dt从返回位置(m)的函数更改为时间(s)。现在你的度量单位很好,因为速度(m/s)*dt(s)确实是一个位置(m)@Paolo Falabella:谢谢,我想我开始理解了。使用->Vector3,我试图表示next_pos的返回值,但我认为这样我定义了dt的返回值,对吗?esatto:)如果Vector3是next_pos的返回值,那么显式语法是:让next_pos(位置:Vector3,速度:Vector3,dt:float):Vector3
@Paolo Falabella:非常感谢,您的评论帮助我解决了这个问题事实上现在您已经将dt从一个返回位置(m)的函数更改为一个时间(s)。现在你的度量单位很好,因为速度(m/s)*dt(s)确实是一个位置(m)@Paolo Falabella:谢谢,我想我开始理解了。使用->Vector3,我试图表示next_pos的返回值,但我认为这样我定义了dt的返回值,对吗?esatto:)如果Vector3是next_pos的返回值,那么显式语法是:让next_pos(位置:Vector3,速度:Vector3,dt:float):Vector3
@Paolo Falabella:非常感谢,您的评论帮助我解决了这个问题是的..我已经定义了+运算符,谢谢。。这就是问题所在。是的..我已经定义了+运算符,谢谢。。这就是问题所在。