【发布时间】:2015-07-06 14:42:41
【问题描述】:
我用 F# 编程已经有几年了,有一个“问题”一直困扰着我一段时间,我一直没能解决。这不是一个错误,我认为这是一个设计决定,但无论如何,问题是这样的:有没有办法延迟(也许这不是正确的词)接口的实现?,即不实现它们在最初的定义中,但后来,在我为该类型实现了一个模块之后,可能在同一个文件中。我将用一个简化的例子来解释: 假设我有以下数据结构:
type 'T MyCollection =
(*type definition*)
interface IEnumerable<'T> with
member this.GetEnumerator () =
(* I don't want to implement it here
because I still don't have the module
with a toSeq function *)
如果我在那里实现该方法,我还必须将所有函数实现为该类型的方法,然后该模块将只是调用这些方法的“代理”。通过这种方式,我创建了一个面向对象优先的数据结构,然后创建了一个模块(重载了类型注释)以允许功能优先的使用。我更愿意编写一个功能优先的数据结构(更简洁,因为类型推断可以更好地工作),然后创建一个 OO 包装器,以便更好地支持 C# 等语言的智能感知。该方法符合 F# 的设计指南告诉我们的内容,但接口不能在任何地方实现,只能在类型的初始定义中实现。这种限制迫使我用成员编写整个数据结构。 我一直在寻找示例,我发现FSharp.Core list 中的列表实现完全符合我的要求,但我不能这样做,编译器不会让我这样做。 我几乎可以肯定这是一个设计决定,也许是为了避免鼓励不良做法,我不知道,但我不认为我的愿望是一种不良做法。我也很清楚 fsharp 编译器的线性特性。
如果你们中的任何人知道如何做我想做的事,请告诉我,我会很高兴的。另外,如果你们中的任何人知道为什么我不应该遵循这种方法,我也会很高兴知道。这对其他人来说不是问题一定是有原因的。
提前致谢。
【问题讨论】:
标签: f#