Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 向量与F中的度量单位相乘#_F#_Vector_Measure - Fatal编程技术网

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:非常感谢,您的评论帮助我解决了这个问题是的..我已经定义了+运算符,谢谢。。这就是问题所在。是的..我已经定义了+运算符,谢谢。。这就是问题所在。