gpt4 book ai didi

f# - 使用可区分联合对多级继承进行建模

转载 作者:行者123 更新时间:2023-12-03 09:47:18 26 4
gpt4 key购买 nike

是否有推荐的方法来模拟 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) 可能更有意义。最常见/最明显的权衡是类层次结构是“开放的”而 DU 是“封闭的”。也就是说,您可以轻松地向类层次结构添加新类型,但添加新操作(基类上的抽象方法)需要更改所有现有类。相比之下,使用 DU,您可以轻松添加新操作(模式匹配数据类型的函数),但要添加新案例(子类),您必须重新定义类型并更新所有现有操作以处理新案例. (这有时被称为“表达问题”。)

一个对 DU 有益的典型例子是编译器;您有一个语言抽象语法树,其中语言和树结构是固定的,但是您可以在编译器中编写许多不同的树转换操作。一个有利于类层次结构的典型例子是 UI 框架;您有一些基类定义了小部件必须提供的所有操作(绘制、调整大小等),但随后用户将添加他们自己的具有额外功能的自定义子类型。

关于f# - 使用可区分联合对多级继承进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1871017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com