2

我对 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?

我在突出显示的行上尝试了很多东西,但似乎无法让编译器满意。例如,我尝试过,Vector3D('T 0, 'T 0, 'T 0)我认为应该将int零转换'T为零,但没有奏效。

我错过了一些基本的东西还是仅仅是获得正确语法的一个例子?

4

2 回答 2

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 ()
于 2013-11-11T14:35:52.373 回答
3

尝试使用该defaultof功能:

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

    new() = Vector3D<'T>(Unchecked.defaultof<'T>, 
                         Unchecked.defaultof<'T>, 
                         Unchecked.defaultof<'T>) 

请注意,如果'T是引用类型,defaultof<'T>则将为空。为了解决这个问题,您可以使用泛型类型约束来限制'T值类型——也称为struct's。

type Vector3D<'T when 'T : struct> (x :'T, y: 'T, z: 'T) = 
    ...

有了它,您仍然可以将它Vector3D<'T>int, float,decimal和许多其他常用类型一起使用,但它会保证x, y, or z, 成员都不能为空。

于 2013-11-11T11:56:41.620 回答