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