Расширение типа F # с преобразованием типов единиц измерения, приводящее к странной ошибке - PullRequest
1 голос
/ 19 ноября 2011

У меня есть функция, которая преобразует из моей собственной реализации трехмерного вектора (который поддерживает единицы измерения) в реализацию XNA:

type Vector3<[<Measure>]'a> with
    member inline v.ToXna() =
        Microsoft.Xna.Framework.Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)

При компиляции я получаю странную ошибку:

Подпись и реализация несовместимы, поскольку параметр типа в классе / подписи имеет другое требование времени компиляции, чем параметр в элементе / реализации

inline кажется необходимостью;без него я получаю эту ошибку:

Эта конструкция приводит к тому, что код становится менее общим, чем указано в аннотациях типов.Переменная единицы измерения 'a была ограничена, чтобы быть мерой' m '.

Есть идеи, что происходит?

Редактировать Ответить @Вопросы svick, Vector3 определяется как:

type Vector3<[<Measure>]'u> =
    struct
        val x:float32<'u>
        val y:float32<'u>
        val z:float32<'u>
        new(x, y, z) = { x = x; y = y; z = z }
    end

И у меня также есть некоторые проблемы с выводом типа, определяющие его как нормальную функцию:

let vector3 (v:DumpEngine.Vector3<_>) =
    Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)

Причиняет функцию быть Vector3<1> -> Microsoft.Xna.Framework.Vector3, что делает его совершенно непригодным для использования.Я не уверен, что это связанная проблема.

Ответы [ 2 ]

6 голосов
/ 20 ноября 2011

Другое решение, которое полностью обходит проблему, используя приведение, а не деление:

type Vector3<[<Measure>]'u> with
    member inline v.ToXna() =
        Microsoft.Xna.Framework.Vector3(float32 v.x, float32 v.y, float32 v.z)
1 голос
/ 20 ноября 2011

Понятия не имею, что происходит, но, похоже, это работает:

let inline ToXna(v:Vector3<'a>) =
    Microsoft.Xna.Framework.Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)

Хотя это лучшее, что мне удалось сделать.

...