1
4
区分并集的一大优势是,在编译时可能的情况集是已知的,所以编译器可以告诉你什么时候你的代码不能处理可能的情况。这对重构有很大帮助,因为你可以在现有的并集中添加一个新的用例,编译器会告诉你代码中哪些地方需要更改。 另一个好处是,区分并集上的模式匹配在语法上很优雅——您可以编写非常清晰的代码。 理论上,您可能可以使用Reflection.emit动态生成DU,甚至可以在现有案例中添加新案例。然而,以上两种优势都不适用,所以我认为使用它们没有多大意义。 IMO,标准继承模型也是处理动态加载插件的正确方法。在每个插件所依赖的DLL中定义一个接口或公共基类,让插件定义一个实现它的类,然后在加载后在插件上使用该接口/基类上的方法。 DU被设计为预先固定一组可能的/values/,但使任何人都可以轻松地在DU上编写新函数,而面向对象继承被设计为提前固定一组潜在的基本/functions/,但使所有人都可以容易地添加新值。由于动态加载代码就是添加新值,所以我认为这是一种非常自然的方法。 顺便说一句,DU实际上是由F#编译器使用.NET继承实现的——整个并集类型都有一个基类,然后每个并集情况都有单独的派生类(尽管我认为无参数情况会得到特殊处理)。 |
plinth · F#:DU用例上的类型匹配,使其更通用 9 年前 |
Sumrak · f#:常量联合箱标记号 10 年前 |
CodeBeard · 是否可以在fsharp中动态生成判别并集? 11 年前 |