我正在尝试在IEnumerable上应用Seq函数.更具体地说,它是System.Windows.Forms.HtmlElementCollection实现ICollection和IEnumerable.
由于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)