簡體   English   中英

F#:轉換為泛型類型

[英]F#: Casting to generic type

我是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 0但是這不起作用。

我錯過了一些基本的東西,還是僅僅是獲得正確語法的情況?

這是一個使用內置通用零函數的解決方案:

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 ()

嘗試使用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>將為null。 為了解決這個問題,您可以使用泛型類型約束來限制'T到值類型” - 也稱為struct

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

通過這種方式,您仍然可以將此Vector3D<'T>intfloatdecimal和許多其他常用類型一起使用,但它將保證xyz成員中的任何一個都不能為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM