我已经为我构建的集合实现了IEnumerable,并且(虽然我没有对它们进行全部测试),但Seq值似乎能够正常工作。当我的集合的本地性能比使用Seq的基于IEnumerable的函数更好时,是否可以重写某些Seq值,例如“last”?我没有找到任何有关压倒Seq的信息。是否可以重写Collections.Seq模块中的值?
2
A
回答
2
否 - Seq
模块中的功能不能被覆盖。但是,其中一些尝试通过检查输入值(通过它们的seq<'T>
实例)来优化性能,以查看它是否为IList<'T>
或'T[]
的实例;如果是的话,这些函数将采取一些优化的代码路径。例如,如果将一个数组('T[]
)传递给Seq.length
,它将能够通过使用数组的.Length
属性快速确定长度。
如果您被困在使用Seq
模块,我能想到的唯一性能优化将使您的集合也实现ICollection<'T>
和/或IList<'T>
。这可能会优化一些情况,但它不会是全部个案。
2
正如在其他答案中已经说过的那样,您无法覆盖Seq
模块中的功能。如果您正在实施自定义集合,那么最好的做法是遵循核心F#库使用的标准模式。
的
Seq
模块包含可合理地规定的任何序列中最经常使用的功能和功能。模块等
Array
或List
提供用于特定集合类型更有效的实现和它们添加更多的功能(在Seq
不可用),其特定于集合(例如,函数和List.tail
Array.get
)。
将自己的收藏时,最好的办法是遵循这个模式:
实现
IEnumerable<'T>
使从Seq
模块的工作职能为你的类型创建
MyCollection
模块包含标准功能的高效实现(至少那些对您很重要的功能)并添加更多针对您的收藏集的功能。
相关问题
- 1. 是否可以部署IIS7 URL重写模块?
- 2. 是否可以重写window.document.location.host?
- 3. 是否可以重写drupal_build_css_cache?
- 4. 是否可以重写DRF中的StringRelatedField?
- 5. 是否可以重写Swift中的deinit?
- 6. 是否可以从IIS 7.5中的URL重写模块导出规则?
- 7. 是否有可能重写#initialize在Ruby模块中?
- 8. 是否可以集中Grunt模块?
- 9. 是否可以在java中编写nginx模块?
- 10. 是否可以在Ruby的其他模块中包含模块?
- 11. 是否有可能重写合并模块的行为
- 12. 是否可以在函数或值绑定中使用F#模块缩写?
- 13. 是否可以在dnn模块中只重置css
- 14. 玉 - 是否可以添加到块重写?
- 15. 是否可以重写django模型上的.objects?
- 16. 是否可以克隆sugarcrm模块?
- 17. 是否可以重写向后导航?
- 18. 是否可以重写std :: endl?
- 19. 是否可以重写内联函数?
- 20. 是否可以重写“调用”函数?
- 21. 是否可以重写Model.objects.all()方法?
- 22. 是否可以重写表单助手?
- 23. 重写Bootstrap V4的预设CSS是否可以重写?
- 24. 是否可以重置 - 使用ansibles git模块?
- 25. 是否可以编写一个通用重新绑定模板?
- 26. 是否可以将多模块pom作为父多模块pom的模块?
- 27. 是否可以使用Feature模块来删除模块?
- 28. 模块中的类是否可以使用扩展模块的类的属性?
- 29. 从模块导入的函数是否可以访问此模块中的类?
- 30. scikit中的HMM模块是否可靠?
感谢您的详细解答。我想答案是“不”,但值得一提的是我忽略了一些事情。 –