Использование функций Seq в IEnumerable

Я пытаюсь применить функции Seq в IEnumerable. Более конкретно, он System.Windows.Forms.HtmlElementCollection, который реализует ICollection и IEnumerable.

Так как F # seq является IEnumerable, я думал, что могу написать

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

но компилятор не будет иметь этого, и жалуется, что "Тип" HtmlElementCollection "несовместим с типом" seq < "a > ".

Однако компилятор охотно принимает IEnumerable в выражении последовательности for .. in ..:

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

Что мне нужно сделать, чтобы IEnumerable обрабатывался так же, как и любой старый F # seq?

NB: Этот вопрос отмечен как дубликат, но это не так. Связанный "дубликат" относится к нетипизированным последовательностям (seq из выражения seq {for...}), тогда как мой вопрос касается типизированных последовательностей.

Ответы

Ответ 1

F # type seq<'a> эквивалентен общему IEnumerable<'a> в System.Collections.Generic, но не к не-generic IEnumerable. Вы можете использовать функцию Seq.cast<'a> для преобразования из не общего в общий:

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