0
A
回答
1
seq<'T>
类型是编写适用于F#中任何集合的计算的主要方式。有您能与类型工作的几种方法:
- 您可以使用函数从
Seq
模块(如Seq.filter
,Seq.windowed
等) - 您可以使用序列内涵(如
seq { for x in col -> x * 2 }
) - 您可以使用底层(势在必行)
IEnumerator<'T>
类型,有时需要例如如果要实现自己的收藏夹压缩(通过调用GetEnumerator
返回)
这是相对简单的类型,它只能用于从集合中读取数据。因此,您将始终获得类型为seq<'T>
的值,该值本质上是一个惰性序列。 F#没有任何用于转换集合的机制(例如,采用集合C
到具有新值的集合C
的通用函数)或用于创建集合(在Haskell或Scala中可用)的任何机制。
在大多数实际情况下,我没有发现问题 - 大部分工作可以使用seq<'T>
完成,当您需要专门的集合(例如数组用于性能)时,通常需要稍微不同的实现无论如何。
2
集合的泛型编程可以像泛型编程一样进行处理:使用泛型。
let f (map_fun : ('T1 -> 'T2) -> 'T1s -> 'T2s) (iter_fun : ('T2 -> unit) -> 'T2s -> unit) (ts : 'T1s) (g : 'T1 -> 'T2) (h : 'T2 -> unit)=
ts
|> map_fun g
|> iter_fun h
type A =
static member F(ts, g, h) = f (Array.map) (Array.iter) ts g h
static member F(ts, g, h) = f (List.map) (List.iter) ts g h
有点丑陋和冗长,但它是可能的。我正在使用类和静态成员来利用重载。在你的代码中,你可以使用A.F,并调用正确的专业化。
要获得更漂亮的解决方案,请参见https://stackoverflow.com/questions/979084/what-features-would-you-add-remove-or-change-in-f/987569#987569尽管仅针对核心库启用了此功能,但修改编译器以使其在您的代码中不会出现问题。这是可能的,因为编译器的源代码是打开的。
+0
谢谢,Joh。这确实很冗长。 – 2011-04-21 13:59:24
相关问题
- 1. 如何通过实现类对抽象集合进行排序?
- 2. 对一个集合进行抽象
- 3. XSD:抽象类集合
- 4. 如何创建抽象类类型对象的集合
- 5. 通用抽象类型C++
- 6. 通过抽象类的向量进行迭代
- 7. 集合抽象泛型类,原料类警告
- 8. 从抽象集合中产生抽象集合
- 9. 提供访问抽象类的集合
- 10. 抽象类型
- 11. 抽象通过
- 12. 如何通过集合进行绑定?
- 13. MSUnity - 注册类型 - 通用抽象类
- 14. 集合的通用类型子集合
- 15. 通过泛型集合
- 16. 休眠 - 通过多个集合进行集合选择
- 17. 如何在抽象类(C#)的泛型集合中使用派生类型?
- 18. python中的抽象类:执行类型
- 19. 从抽象类继承属性,并在抽象属性上对集合进行排序
- 20. ManyToManyField通过对抽象模型
- 21. Understaing抽象类型
- 22. 如何通过使用multimap(apache集合类型)使用集合集合
- 23. 如何通过引用抽象类 - Java
- 24. 通过抽象类的I/O宏
- 25. 实例化问题通过抽象类
- 26. Java抽象类和类型
- 27. 抽象类 - 儿童类型
- 28. 在scala中混合类型参数和抽象类型
- 29. 获取集合的动态类型安全视图”通过集合类
- 30. 通过scala函数抽象而不会丢失类型
谢谢你的回答。因此,如果我想保留关于我的原始集合的类型的信息(比如说,为了避免在以后要将“Knuth shuffle”链接到手动拉链操作时被强制调用'Seq.toArray'),我必须咬子弹和复制粘贴zipWith我想支持的所有集合类型? – 2011-04-20 12:44:32
@Alexander:是的,据我所知,完全不依赖于容器的算法(例如C++中)是不可能的。我想理论上可以在不同的集合类型周围实现面向对象的包装器......但这会值得吗? - Wrt。到'zipWith':所有的收集模块都支持'map2'函数。 – wmeyer 2011-04-20 16:19:50
@wmeyer:谢谢。能够独立于容器实现编写算法对我来说是一个很有价值的特性。据我所知,在大多数实际情况下,缺乏这种能力不是问题,我认为我从根本上不了解如何构建F#代码。 – 2011-04-20 18:17:27