Использование функций 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")