代码之家  ›  专栏  ›  技术社区  ›  CodeBeard

是否可以在fsharp中动态生成判别并集?

  •  3
  • CodeBeard  · 技术社区  · 11 年前

    我正在考虑使用 System.ComponentModel.Composition 在Fsharp中,他想知道是否有可能在内存中动态生成一个判别并集?我想要一个DU,它是基于导入的类型的元素构建的。主要原因是我有一个DU的代码,我认为与它一起使用最简单 Composition 我完全准备好接受这样做是错误的。

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

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

    • 有可能吗?
    • 这样做明智吗?
    • 我真的应该吗 是否使用DU来表示作文中的内容?
    • 我很乐意使用反思,尽管它有点慢。

    编辑

    • 是否可以/建议动态添加到DU?(如果必须存在DU)
    1 回复  |  直到 11 年前
        1
  •  4
  •   Ganesh Sittampalam    11 年前

    区分并集的一大优势是,在编译时可能的情况集是已知的,所以编译器可以告诉你什么时候你的代码不能处理可能的情况。这对重构有很大帮助,因为你可以在现有的并集中添加一个新的用例,编译器会告诉你代码中哪些地方需要更改。

    另一个好处是,区分并集上的模式匹配在语法上很优雅——您可以编写非常清晰的代码。

    理论上,您可能可以使用Reflection.emit动态生成DU,甚至可以在现有案例中添加新案例。然而,以上两种优势都不适用,所以我认为使用它们没有多大意义。

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

    DU被设计为预先固定一组可能的/values/,但使任何人都可以轻松地在DU上编写新函数,而面向对象继承被设计为提前固定一组潜在的基本/functions/,但使所有人都可以容易地添加新值。由于动态加载代码就是添加新值,所以我认为这是一种非常自然的方法。

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