我写了以下内容
[<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}
现在我正试图以这种方式使用它:
let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> -> Vector3<m>) =
position + (velocity * dt)
它给了我一个编译错误,但我很确定测量单位是正确表达的。 我的错是什么?
答案 0 :(得分:3)
您尝试用于指定返回类型的语法不正确。它应该是这样的:
let next_pos (position:Vector3<m>, velocity:Vector3<m/s>, dt:float<s>) : Vector3<m> =
position + (velocity * dt)
要指定函数返回类型Vector3<m>
的值,您需要在结果中添加类型注释,这可以通过编写let foo <arguments> : T = <expr>
来完成。向参数添加类型注释时,需要对这些注释进行括号化(因此语法不明确)。如Paolo在评论中所述,您使用->
表示dt
是一个函数,因为注释float<s> -> Vector3<m>
已附加到参数dt
。
为了使代码编译,我还必须向(+)
添加Vector3
运算符的实现,但我假设你已经有了(并且在发布问题时就把它遗漏了)。
答案 1 :(得分:1)
我这样解决了(但我不确定原因)。
let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> ) =
position + (velocity * dt)
如果我明确定义了返回类型,似乎编译器失败了。如果我删除它似乎能够推断出正确的类型。 但是为什么呢?
除此之外,在某些情况下,类型声明中的名称冲突迫使我明确指定返回类型。所以我认为这最终不是正确的解决方案。