在采用泛型类型参数的函数中使用的函数返回类型
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*提供的。
所以我有这个代码:
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*提供的。