2

我已经为我构建的集合实现了 IEnumerable,并且(尽管我没有对它们全部进行测试)Seq 值似乎可以正常工作。当我的集合的值的本机性能优于使用 Seq 的基于 IEnumerable 的函数时,是否可以覆盖某些 Seq 值,例如“last”?我还没有找到任何关于覆盖 Seq 的信息。

4

2 回答 2

2

正如在另一个答案中已经说过的,您无法覆盖Seq模块中的功能。如果您正在实现自定义集合,那么最好的做法是遵循核心 F# 库使用的标准模式。

  • Seq模块包含最常用的功能和可以为任何序列合理提供的功能。

  • 模块喜欢ArrayList为特定集合类型提供更有效的实现,并且它们添加了更多特定于集合的函数(在 中不可用Seq)(例如,函数List.tailArray.get)。

添加您自己的集合时,最好的方法是遵循以下模式:

  • 实现IEnumerable<'T>以便Seq模块中的功能适用于您的类型

  • 创建MyCollection包含标准功能(至少是对您重要的功能)的有效实现的模块,并添加更多特定于您的集合的功能。

于 2012-09-10T08:43:48.443 回答
2

不——Seq模块中的函数不能被覆盖。然而,他们中的一些人确实试图通过检查他们的输入值(seq<'T>你传递给他们的实例)来优化性能,看看它是否是IList<'T>or的一个实例'T[];如果是,这些函数将采用一些优化的代码路径。例如,如果您将数组 ( 'T[]) 传递给Seq.length,它将能够通过使用.Length数组的属性快速确定长度。

如果您坚持使用该Seq模块,我能想到的唯一性能优化就是让您的集合也实现ICollection<'T>和/或IList<'T>. 这可能会优化某些情况,但不会是所有情况。

于 2012-09-09T19:29:43.383 回答