我正在尝试在IEnumerable上应用Seq函数。更具体地说,它是System.Windows.Forms.HtmlElementCollection
,它实现了ICollection
和IEnumerable
。
由于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),而我的问题是关于类型的序列。
答案 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")