Dynamic 是否可以在fsharp中动态生成一个有区别的联合?

Dynamic 是否可以在fsharp中动态生成一个有区别的联合?,dynamic,f#,discriminated-union,Dynamic,F#,Discriminated Union,我正在研究如何在Fsharp中使用System.ComponentModel.Composition,并想知道是否有可能在内存中动态生成一个有区别的并集?我想有一个DU,它是根据导入的类型元素构建的。主要原因是我有一个DU的代码,我认为用组合最简单。我完全准备接受这样做是错误的 过去,我对各种事情使用了FSharpType和FSharpValue,但似乎这些都是关于操作现有的DU,而不是创建新的DU 很抱歉,我甚至还没有“我试过这个”代码示例,因为我不知道从哪里开始 可能吗 这样做明智吗 我真

我正在研究如何在Fsharp中使用
System.ComponentModel.Composition
,并想知道是否有可能在内存中动态生成一个有区别的并集?我想有一个DU,它是根据导入的类型元素构建的。主要原因是我有一个DU的代码,我认为用
组合
最简单。我完全准备接受这样做是错误的

过去,我对各种事情使用了
FSharpType
FSharpValue
,但似乎这些都是关于操作现有的DU,而不是创建新的DU

很抱歉,我甚至还没有“我试过这个”代码示例,因为我不知道从哪里开始

  • 可能吗
  • 这样做明智吗
  • 我真的不应该用DU来表示来自构图的内容吗
  • 我很乐意使用反射,尽管它有点慢
编辑

  • 是否可以/建议动态添加到DU?(如果必须存在DU)

区分并集的最大优点之一是,可能的情况集在编译时已知,因此编译器可以告诉您代码何时无法处理可能的情况。这对重构有很大帮助,因为您可以向现有的联合添加一个新案例,编译器将告诉您代码中需要更改的位置

另一个好处是,在有区别的联合上进行模式匹配在语法上是优雅的——您可以编写非常清晰的代码

从理论上讲,您可能可以使用Reflection.emit动态生成DU,或者甚至可以将新案例添加到现有案例中。然而,以上两个优点都不适用,所以我真的不认为使用它们有什么意义

标准继承模型也是处理动态加载插件的正确方法,IMO。在每个插件所依赖的DLL中定义一个接口或公共基类,让插件定义一个实现它的类,然后在加载插件后在该接口/基类上使用方法

DU的设计目的是提前修复可能的/值/集合,但使任何人都可以轻松地在DU上编写新函数,而面向对象继承的设计目的是提前修复可能的基本/函数/集合,但使任何人都可以轻松地添加新值。因为动态加载代码就是为了添加新的值,所以我认为这是一个非常自然的选择


顺便提一下,DU实际上是由F#编译器使用.NET继承实现的——整个联合类型都有一个基类,然后每个联合类型都有单独的派生类(尽管我认为无参数的情况会得到特别处理)。

这听起来像是类型提供程序的问题。我很感兴趣。当编译时检查和模式匹配与DU一起进行时,DU的类型提供程序非常有用。如果您的数据变化如此之大,以至于可以采用如此多不同的类型/表示,那么这听起来像是类型提供程序的工作。有趣的注释,而不是数据我的用例是MEF的可扩展性。也就是说,在运行时引入的目录中将有.dll。然后我使用反射来处理DU。(这可能是完全错误的做法:D)我可能不建议使用它;)但是如果你真的想动态生成DU,我已经创建了一个这样做的项目Hi Ganesh,谢谢你的回答。我把这个作为答案,因为它显示了我是如何试图做错事的。将以不同的模式前进。:)