是否有推薦的方式來建模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