在IEnumerable上使用Seq函数

Joh*_*lds 20 ienumerable f#

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

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

let foo = myHtmlElementCollection |> Seq.find (fun i -> i.Name = "foo")
Run Code Online (Sandbox Code Playgroud)

但编译器将没有它,并抱怨"类型'HtmlElementCollection'与类型'seq <'a>'"不兼容.

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

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

为了让IEnumerable像任何旧的F#一样被处理,我需要做什么seq

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

GS *_*ica 36

F#的类型seq<'a>等同于一般 IEnumerable<'a>System.Collections.Generic,但不是到非通用 IEnumerable.您可以使用该Seq.cast<'a>函数从非泛型转换为泛型函数:

let foo = myHtmlElementCollection
            |> Seq.cast<HtmlElement>
            |> Seq.find (fun i -> i.Name = "foo")
Run Code Online (Sandbox Code Playgroud)