2017-02-18 70 views
1

所以我有这样的代码:函数返回一个函数使用的类型采取了泛型类型参数

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。

+3

类型参数必须是静态已知的,它们不能是动态计算的结果。 – kvb

+4

在运行时存在'Type'实例; 'enum'需要一个编译时参数。 – ildjarn

回答

2

你不能这样做,“类型安全”意味着你(编译器)知道静态类型(不执行代码)。通过铸造到obj你会失去这种知识。添加运行时间类型(typeof)没有帮助。即使你可以使用返回的元组的第二个值,那么这会有什么帮助?你的程序代码将被硬编码,无论你的价值如何。

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

let o : t = test someBool someInt 

它可以是ZeroFour,即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,例如, F*规定。

相关问题