Modest opinions  
by a humble autodidact
首先,有三种产生集合的格式:
{ ... } 产生一个有seq<'a> interface的不明类型对象。所谓“不明类型”,是指用户不需要关心具体的类型,只要知道三件事情:1.这个对象有 seq<'a> interface,2.{}里面的代码是lazily evaluated的 3.{}里面不能用;号做分隔符列举元素,如{1;2}是不行的,因为{}的特性是lazy evaluation,这样做没有意义。
[ ... ] 产生一个list<'a>类型的集合,里面的函数调用都是eagerly evaluated的。
[| ...|]产生一个‘a [],即.NET数组,不用说是eager evaluation。

然后是几个定义在FSharp.Core.Pervasive中的operator:
seq是个类型转换operator,它原封不动的返回operand对象,但返回的类型是seq<'a>,也就是说它的operand必须有IEnumerable<T> interface。以上三种产生集合的格式都可以做seq的operand,但seq {...}和{...}没有区别,因为{...}返回的类型本来就是seq<'a>。
set将一个有seq<'a> interface的对象里的元素加入到一个Set<'a>类型的集合对象里。如果将set operator应用于{...},所有delayed函数调用都要被force出来。
dict的类型是#seq<'a * 'b> -> IDictionary<'a,'b>,看名字和类型就知道这个operator是干什么的了。

最后还有一个LazyList,用LazyList.unfold产生出来的集合与用{...}或Seq.unfold产生出来的集合的同异是:它们都是lazily evaluated,但是LazyList会cache遍历过的元素。


posted on 2008-03-16 13:01  yushih  阅读(426)  评论(4编辑  收藏  举报