Умножение векторов с единицей измерения в F # - PullRequest
1 голос
/ 29 ноября 2011

Я написал следующее

[<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 ]

3 голосов
/ 29 ноября 2011

Синтаксис, который вы пытались использовать для указания типа возвращаемого значения, был неверным. Это должно выглядеть так:

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>. При добавлении аннотаций типов к параметрам их необходимо заключать в скобки (чтобы синтаксис не был неоднозначным). Как отметил Паоло в комментарии, вы использовали ->, когда говорили, что dt - это функция, потому что аннотация float<s> -> Vector3<m> была прикреплена к параметру dt.

.

Чтобы компилировать код, мне также пришлось добавить реализацию (+) оператора к вашему Vector3, но я предполагаю, что у вас уже есть это (и просто пропустил это при публикации вопроса).

1 голос
/ 29 ноября 2011

Я решил таким образом (но я не уверен в причине).

let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> ) =
     position + (velocity * dt)

Похоже, что компилятор выйдет из строя, если я явно определю тип возвращаемого значения.Если я удаляю это, кажется, в любом случае может вывести правильный тип.Но почему это?

Кроме того, существуют ситуации, в которых конфликты имен в объявлении типа вынуждают меня явно указывать тип возвращаемого значения.Поэтому я не думаю, что в конце концов это правильное решение.

...