使用受歧视的联合建模多级继承

Dan*_*iel 5 f#

是否有推荐的方法来模拟F#中的多个继承级别,可能是使用区分联合?

在C#中使用以下内容:

class Expr { }
class SourceExpr : Expr { }
class JoinExpr : SourceExpr { }
class TableExpr : SourceExpr { }
Run Code Online (Sandbox Code Playgroud)

我在F#中做到了这一点:

type SourceExpr =
    | Join of JoinExpr
    | Table of TableExpr

type Expr = 
    | Source of SourceExpr
    | ...
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?这是否提供与继承相同的多态行为?

Bri*_*ian 8

没有更多信息,这里很难过于规范.根据您要执行的操作,使用类层次结构或区分联合(DU)可能更有意义.最常见/最常见的权衡是类层次结构是"开放的"而DU是"封闭的".也就是说,您可以轻松地将新类型添加到类层次结构中,但添加新操作(基类上的抽象方法)需要更改所有现有类.相反,使用DUs,您可以轻松添加新操作(模式匹配数据类型的功能),但是要添加新案例(子类),您必须重新定义类型并更新所有现有操作以处理新案例.(这有时被称为"表达问题".)

一个对DUs有益的典型例子是编译器; 你有一个语言抽象语法树,其中语言和树结构是固定的,但你可以在编译器内编写许多不同的树变换操作.适用于类层次结构的典型示例是UI框架; 你有一些基类定义了小部件必须提供的所有操作(Draw,Resize,...),但用户将添加自己的自定义子类型和额外的功能.