是否有推荐的方式来建模F#中的多个继承级别,假定使用区分的联合?使用歧视联盟建模多个级别的继承
以在C#中像下面这样:
class Expr { }
class SourceExpr : Expr { }
class JoinExpr : SourceExpr { }
class TableExpr : SourceExpr { }
我在F#做到了这一点:
type SourceExpr =
| Join of JoinExpr
| Table of TableExpr
type Expr =
| Source of SourceExpr
| ...
有没有更好的办法?这是否提供了与继承相同的多态行为?
我正在研究解析器,所以我认为DU是正确的选择。但有些表达方式似乎是从别人那里继承的。有些函数应该接受Join或Table,它们都是源。还有一些功能可以接受Expr,其中Source是众多选项之一。我不禁想到OO术语,但我想知道是否有更好的方法来模拟这种相对静态的层次结构,同时保持相同类型的多态行为。 – Daniel 2009-12-09 01:47:15
使用类型对它进行建模可以很好地工作。如果您有两种类型的“也”是同一种东西,请添加一个区分它们并使用它的新类型。唯一的缺点是,你将不得不做更多的解构,但模式匹配和主动模式,你需要他们使它非常容忍。我正在做一些相当复杂的递归类型和一个FParsec解析器,它工作得很好。 – 2009-12-10 15:34:58