f# sequences static-members

Seq seq type como parámetro de miembro en F#



sequences static-members (2)

Cambia tu código a

type Test() = static member func (a: seq<#seq<''a>>) = 5. let a = [[4.]] Test.func(a)

El truco está en el tipo de a. Necesita permitir explícitamente que el seq externo contenga instancias de seq <''a> y subtipos de seq <'' a>. Usar el símbolo # lo habilita.

¿Por qué este código no funciona?

type Test() = static member func (a: seq<''a seq>) = 5. let a = [[4.]] Test.func(a)

Da el siguiente error:

The type ''float list list'' is not compatible with the type ''seq<seq<''a>>''


El mensaje de error describe el problema: en F #, list<list<''a>> no es compatible con seq<seq<''a>> .

La función upcast ayuda a evitar esto, haciendo a en una list<seq<float>> , que luego es compatible con seq<seq<float>> :

let a = [upcast [4.]] Test.func(a)

Editar: puede hacer que la func más flexible en los tipos que acepta. El original solo acepta secuencias de seq<''a> . Aunque la list<''a> implementa seq<''a> , los tipos no son idénticos, y el compilador le da un error.

Sin embargo, puede modificar func para aceptar secuencias de cualquier tipo, siempre que ese tipo implemente seq<''a> , escribiendo el tipo interno como #seq :

type Test() = static member func (a: seq<#seq<''a>>) = 5. let a = [[4.]] Test.func(a) // works