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