【发布时间】:2017-07-07 05:12:18
【问题描述】:
我是 F# 的新手,在尝试设计某些类型时,我注意到 OOP 对我的设计决策有多大影响。我很难找到这个特殊的问题,结果空手而归。
我将描述我在 C# 中尝试做的事情,因为我更熟悉这些术语。假设我有一个接口,在类容器类上指定了一些最少的必需方法。我们称之为IContainer。然后我有两个实现这个接口的类,ContainerA 和ContainerB,它们具有对用户隐藏的不同底层实现。这是一种非常常见的 OOP 模式。
我试图在 F# 中仅使用不可变类型来实现相同的功能以留在功能世界中,即如何实现其功能可互换但用户将使用的公共功能保持不变的类型:
type 'a MyType = ...
let func1 mytype = ...
let func2 mytype -> int = ...
MyType 的定义未知,以后可以更改,例如如果找到了更有效的函数版本(如容器类型的更好实现),但无需太多努力或需要重新设计整个模块。一种方法是在函数中使用模式匹配和有区别的联合,但这似乎不太可扩展。
【问题讨论】:
-
那么您是否尝试在 F# 中做完全相同的事情,因为您可以在其中实现类和接口。
-
是的。一种可能性是将设计完全从 C# 复制到 F#,但底层实现必须是派生类的一部分。例如,在容器上运行的函数是否应该调用
container.IsEmpty?以及如何设计类/类型以使let add ... =不会修改对象的状态? -
目前尚不清楚您是尝试在 F# 中执行 OOP,还是从功能角度重新考虑问题。您想以 F# 惯用的方式完成接口的功能,还是想在代码中使用文字接口?
-
如果您所做的只是在 F# 中重新进行 OOP 设计,那么我认为首先使用 F# 没有什么意义。是的,这是可能的,但除此之外呢?您的用例很可能适用于功能解决方案,但您提供的上下文很少 - 事实上,提供的上下文是您的 OOP 设计。能多说一点吗?
-
一个非常广泛的问题。我强烈推荐 1) fsharp.org 上的文档下方的“F# 组件设计指南”,以及 2) 标题为 F# 的网站,以获得您的答案。
标签: f# immutability underlyingtype