我已经为我构建的集合实现了 IEnumerable,并且(尽管我没有对它们全部进行测试)Seq 值似乎可以正常工作。当我的集合的值的本机性能优于使用 Seq 的基于 IEnumerable 的函数时,是否可以覆盖某些 Seq 值,例如“last”?我还没有找到任何关于覆盖 Seq 的信息。
2 回答
正如在另一个答案中已经说过的,您无法覆盖Seq
模块中的功能。如果您正在实现自定义集合,那么最好的做法是遵循核心 F# 库使用的标准模式。
该
Seq
模块包含最常用的功能和可以为任何序列合理提供的功能。模块喜欢
Array
或List
为特定集合类型提供更有效的实现,并且它们添加了更多特定于集合的函数(在 中不可用Seq
)(例如,函数List.tail
和Array.get
)。
添加您自己的集合时,最好的方法是遵循以下模式:
实现
IEnumerable<'T>
以便Seq
模块中的功能适用于您的类型创建
MyCollection
包含标准功能(至少是对您重要的功能)的有效实现的模块,并添加更多特定于您的集合的功能。
不——Seq
模块中的函数不能被覆盖。然而,他们中的一些人确实试图通过检查他们的输入值(seq<'T>
你传递给他们的实例)来优化性能,看看它是否是IList<'T>
or的一个实例'T[]
;如果是,这些函数将采用一些优化的代码路径。例如,如果您将数组 ( 'T[]
) 传递给Seq.length
,它将能够通过使用.Length
数组的属性快速确定长度。
如果您坚持使用该Seq
模块,我能想到的唯一性能优化就是让您的集合也实现ICollection<'T>
和/或IList<'T>
. 这可能会优化某些情况,但不会是所有情况。