带有度量单位转换的F#类型扩展导致奇怪的错误

时间:2011-11-19 17:26:23

标签: f# units-of-measurement type-extension

我有一个函数可以将我自己的3D矢量(支持度量单位)实现转换为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&lt; 1&gt; - &GT; Microsoft.Xna.Framework.Vector3,使其无法使用。不过,我不确定这是一个相关的问题。

2 个答案:

答案 0 :(得分:6)

另一种解决方案,它完全通过使用演员而不是分裂来解决问题:

type Vector3<[<Measure>]'u> with
    member inline v.ToXna() =
        Microsoft.Xna.Framework.Vector3(float32 v.x, float32 v.y, float32 v.z)

答案 1 :(得分:1)

我不知道发生了什么,但这似乎有效:

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

这是我设法做到的最好的事情。