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

时间:2017-02-18 00:28:45

标签: generics f# first-class

所以我有这段代码:

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
    ...

这在最后一行抱怨没有定义。

基本上我要做的就是能够返回这些不同的枚举,而不需要将Zero和Four包装成DU。

1 个答案:

答案 0 :(得分:2)

你不能这样做,&#34;输入安全&#34;暗示您(编译器)知道类型静态(不执行代码)。通过施放到obj,你就会失去知识。添加运行时类型(typeof)没有帮助。即使你可以使用返回的元组的第二个值,它会有什么帮助?对于您拥有的true|false值,您的程序代码将被硬编码。

如果在编译时不知道这个值(例如从控制台读取),你会假设什么类型? t在以下绑定中应该是什么?

let o : t = test someBool someInt

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

type EitherEnum =
| Z of Zero
| F of Four

......一个受歧视的工会,正如你已经想到的那样。

  

基本上我要做的就是能够返回这些不同的枚举,而不需要将Zero和Four包装成DU。

你已经想出了如何做到这一点:施放到obj并且松散类型安全。你无法双管齐下。

您正在寻找的是dependent types,例如F*提供。