簡體   English   中英

具有通用類型參數的函數中使用的函數返回類型

[英]Function returning type used in a function taking a generic type parameter

所以我有這段代碼:

type Zero = One = 1 | Two = 2 | Three = 3
type Four = Five = 5 | Six = 6 | Seven = 7

let test_1 (x : bool) : Type =
    if x
    then typeof<Zero>
    else typeof<Four>

let test_2 () =
     let ty = test_1 true
     let e = enum<ty>(1)
     ...

但是,在最后一行,我得到一個錯誤: Type ty not defined.

有什么建議么?

編輯:

也許是這樣的:

let test_3 (x : bool) (i : int) : obj =
    if x
    then enum<Zero>(i) :> obj
    else enum<Four>(i) :> obj

我當時在想有某種方法可以恢復類型安全性嗎?

也許是這樣的嗎?

let test_4 (x : bool) (i : int) : obj * Type =
    if x
    then enum<Zero>(i) :> obj, typeof<Zero>
    else enum<Four>(i) :> obj, typeof<Four>

然后按以下方式使用它:

let test_5 () =
    let v,t = test_4 true 1
    let o = v :?> t
    ...

這在t定義的最后一行抱怨。

基本上,我想做的是能夠返回這些不同的枚舉,而無需將零和四包裝到DU中。

您無法做到這一點,“類型安全性”意味着您(編譯器) 靜態地知道類型(無需執行代碼)。 通過強制轉換為obj您會失去該知識。 添加運行時類型( typeof )沒有幫助。 即使您可以使用返回的元組的第二個值,對您有什么幫助呢? 您的程序代碼將按照您擁有的true|false值進行硬編碼。

如果在編譯時不知道該值(例如從控制台讀取),您將采用哪種類型? 應該什么t在以下的綁定?

let o : t = test someBool someInt

它可以是ZeroFour ,即Zero | Four Zero | Four ,即type Either = Zero | Four type Either = Zero | Four ,那就是

type EitherEnum =
| Z of Zero
| F of Four

...您已經知道了,一個受歧視的工會。

基本上,我想做的是能夠返回這些不同的枚舉,而無需將零和四包裝到DU中。

您已經弄清楚了該怎么做:強制轉換為obj和松散類型安全性。 您不能同時擁有這兩種方式。

您正在尋找的是依賴類型 ,例如F *提供的東西。

暫無
暫無

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

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