Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何枚举一个有区别的联合以获得名称和类型实例,用F#表示?_F#_Discriminated Union - Fatal编程技术网

如何枚举一个有区别的联合以获得名称和类型实例,用F#表示?

如何枚举一个有区别的联合以获得名称和类型实例,用F#表示?,f#,discriminated-union,F#,Discriminated Union,首先,我读到这篇文章:但它并不能真正解决我的问题 我试图解析一个有区别的联合,获取所有类型,获取它们的名称,然后将它们放入字典中(好吧,不止这些,但这是为了简化示例) 打开Microsoft.FSharp.Reflection MyDU型= |A型 |B型 设l=字典() FSharpType.GetUnionCases类型 |>序号:iter(乐趣x-> l、 [我在这里放什么?]您可以使用FSharpValue.MakeUnion函数使用F#反射创建DU的实例: for x in FShar

首先,我读到这篇文章:但它并不能真正解决我的问题

我试图解析一个有区别的联合,获取所有类型,获取它们的名称,然后将它们放入字典中(好吧,不止这些,但这是为了简化示例)

打开Microsoft.FSharp.Reflection
MyDU型=
|A型
|B型
设l=字典()
FSharpType.GetUnionCases类型
|>序号:iter(乐趣x->

l、 [我在这里放什么?]您可以使用
FSharpValue.MakeUnion
函数使用F#反射创建DU的实例:

for x in FSharpType.GetUnionCases typeof<MyDU> do
  l.[FSharpValue.MakeUnion(x, [||]) :?> MyDU] <- x.Name
FSharpType.GetUnionCases typeof do中x的


l、 [FSharpValue.MakeUnion(x,[| |]]:?>MyDU]对于一些简单的东西来说,这似乎是一个很大的麻烦,给你的DU一个返回所有实例的静态成员可能会容易得多。但是为什么你首先需要这个呢?如果任何实例有一些字段,你无论如何都无法实例化它,至少没有用。DU与枚举有根本的不同(后者是一个简单的本机int,而DU是一个用于各种数据的框)。原因是它用于公共代码中,我想确保在添加类型时,匹配它们的代码将无法编译(因此DU而不是enum)用于不覆盖所有情况。但某些数据流名称是使用“枚举”名称生成的,因此我需要能够对它们进行迭代并提取名称。听起来您应该使用序列化和反序列化作为更简单的解决方案。DU不适用于这种类型的枚举,但这是可能的。
Enum.GetValues(typeof<MyEnum>)
|> unbox
|> Seq.iter (fun x ->
    l.[x] <- string x
for x in FSharpType.GetUnionCases typeof<MyDU> do
  l.[FSharpValue.MakeUnion(x, [||]) :?> MyDU] <- x.Name