在F#中将向量与计量单位相乘

时间:2011-11-29 11:17:20

标签: 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 (*)
        (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)

它给了我一个编译错误,但我很确定测量单位是正确表达的。 我的错是什么?

2 个答案:

答案 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)

如果我明确定义了返回类型,似乎编译器失败了。如果我删除它似乎能够推断出正确的类型。 但是为什么呢?

除此之外,在某些情况下,类型声明中的名称冲突迫使我明确指定返回类型。所以我认为这最终不是正确的解决方案。