在IEnumerable上使用Seq函数

时间:2014-01-30 23:42:51

标签: f# ienumerable

我正在尝试在IEnumerable上应用Seq函数。更具体地说,它是System.Windows.Forms.HtmlElementCollection,它实现了ICollectionIEnumerable

由于F#seq是IEnumerable,我以为我可以写

let foo = myHtmlElementCollection |> Seq.find (fun i -> i.Name = "foo")

但是编译器没有它,并且抱怨“类型'HtmlElementCollection'与类型'seq<'a>'”不兼容。

但是,编译器愿意在for .. in ..序列表达式中接受IEnumerable:

let foo = seq { for i in myHtmlElementCollection -> i } |> Seq.find (fun i -> i.Name = "foo")

为了让IEnumerable像任何旧的F#seq一样被对待,我需要做些什么?

NB:此问题被标记为重复,但事实并非如此。链接的“重复”是关于无类型的序列(来自seq {for ...}表达式的seq),而我的问题是关于类型的序列。

1 个答案:

答案 0 :(得分:34)

F#的类型seq<'a>相当于System.Collections.Generic中的通用 IEnumerable<'a>,但不等同于非泛型 {{ 3}}。您可以使用IEnumerable函数将非泛型函数转换为通用函数:

let foo = myHtmlElementCollection
            |> Seq.cast<HtmlElement>
            |> Seq.find (fun i -> i.Name = "foo")