f# ienumerable

f# - Usando las funciones Seq en un IEnumerable



(1)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de aplicar funciones Seq en un IEnumerable. Más específicamente, es System.Windows.Forms.HtmlElementCollection que implementa ICollection y IEnumerable .

Dado que un F # seq es un IEnumerable, pensé que podría escribir

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

pero el compilador no tendrá nada de eso, y se queja de que "el tipo ''HtmlElementCollection'' no es compatible con el tipo ''seq <'' a> ''" .

Sin embargo, el compilador acepta voluntariamente el IEnumerable en una expresión de secuencia for .. in .. :

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

¿Qué debo hacer para que el IEnumerable sea tratado como cualquier antiguo F # seq ?

NB: Esta pregunta está marcada como un duplicado, pero no lo está. El "duplicado" vinculado trata sobre secuencias sin tipo (una secuencia de la seq {para ...} expresión), mientras que mi pregunta es sobre secuencias escritas .


El tipo seq<''a> F # es equivalente al IEnumerable<''a> genérico IEnumerable<''a> en System.Collections.Generic , pero no al IEnumerable no genérico . Puede utilizar la función Seq.cast<''a> para convertir de una no genérica a una genérica:

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