F#:转换为泛型类型

Dan*_*Dan 2 generics f# casting

我是F#的新手,来自C++背景.我正在尝试编写一个简单的向量类,它可以是泛型类型(int,float等),但我遇到了默认构造函数的问题.我想将值初始化为零,但为了做到这一点,我需要以某种方式将一个具体的零转换为泛型类型,但我不知道如何做到这一点.

也许一些代码可能有所帮助 这是我到目前为止所拥有的:

type Vector3D<'T> (x :'T, y: 'T, z: 'T) = 
    member this.x = x
    member this.y = y
    member this.z = z

    new() = Vector3D<'T>(0,0,0) // what goes here?
Run Code Online (Sandbox Code Playgroud)

我在突出显示的行上尝试了很多东西,但似乎无法让编译器感到高兴.例如,我试过,Vector3D('T 0, 'T 0, 'T 0)我认为应该将int'T归零,但这不起作用.

我错过了一些基本的东西,还是仅仅是获得正确语法的情况?

Wes*_*ser 5

这是一个使用内置通用零函数的解决方案:

type Vector3D<'T> (x : 'T, y: 'T, z: 'T) =
    member this.x = x
    member this.y = y
    member this.z = z

let inline newVector () : Vector3D<_> =
    let zero = Core.LanguagePrimitives.GenericZero
    Vector3D(zero, zero, zero)

let v1 : Vector3D<int> = newVector ()
let v2 : Vector3D<double> = newVector ()
let v3 : Vector3D<int64> = newVector ()
Run Code Online (Sandbox Code Playgroud)

  • @Dan如果你看一下`GenericZero`的类型`GenericZero <^ T(需要^ T和静态成员Zero)>:^ T(需要^ T和静态成员Zero)`.这里要注意的重要一点是你通常看到的`^ T`而不是''T`.这表示该函数具有在编译时解析的泛型约束.也就是说,编译器生成类似于C++模板的代码,这使得它可以工作.使用通用成员约束需要`inline`函数. (2认同)