f# - Usando las funciones Seq en un IEnumerable
(1)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo trato con IEnumerable en F #? 1 respuesta
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")