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

Rei*_*aka 1 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<_>)
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我得到一个奇怪的错误:

签名和实现不兼容,因为类/签名中的type参数与成员/实现中的类型参数具有不同的编译时要求

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
Run Code Online (Sandbox Code Playgroud)

我也有一些类型推断问题,将其定义为正常函数:

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

导致该函数为Vector3 <1> - > Microsoft.Xna.Framework.Vector3,这使得它非常不可用.不过,我不确定这是一个相关的问题.

Rei*_*aka 6

另一个解决方案,通过使用强制转换而不是分割来完全解决问题:

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

  • 我认为这*是'ununit'事物的规范方式.(仅供未来访问者参考,相反可以通过[FloatWithMeasure](http://msdn.microsoft.com/en-us/library/ee806527.aspx)实现.) (2认同)