在采用泛型类型参数的函数中使用的函数返回类型

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 未定义。

基本上我想要做的是能够 return 这些不同的枚举,而无需求助于将零和四包装到 DU 中。

你不能那样做,"type safety" 意味着你(编译器)知道类型静态(不执行代码)。通过投射到 obj 你失去了那个知识。添加 runtime 类型 (typeof) 没有帮助。即使您可以使用返回的元组的第二个值,那又有什么用呢?对于您拥有的任何 true|false 值,您的程序代码将是 hard-coded。

如果此值在编译时未知(例如从控制台读取),您会假设什么类型? t 在下面的绑定中应该是什么?

let o : t = test someBool someInt

可以是Zero,也可以是Four,即Zero | Four,即type Either = Zero | Four,即

type EitherEnum =
| Z of Zero
| F of Four

...正如您已经知道的那样,这是一个受歧视的工会。

Basically what I'm trying to do is to be able to return these different enums without resorting to wrapping Zero and Four into a DU.

您已经知道如何做到这一点:强制转换为 obj 并松散类型安全。不能两全其美。

你要找的是dependent types, something e.g. F*提供的。