2010-07-29 22 views

Respuesta

7

cambiar el código para

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 exterior tenga instancias de seq < 'a > y subtipos de seq <' a >. Usar el símbolo # lo habilita.

4

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, al hacer a en un list<seq<float>>, que luego es compatible con seq<seq<float>>:

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

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

Sin embargo, puede modificar func aceptar secuencias de cualquier tipo, siempre y cuando ese tipo implementa 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 
+0

¿Y por qué es así? Si escribe "dejar func (a: seq <'a seq>) = 5". entonces funciona sin ningún upcasting. –

+0

Me sale el mismo error - http://gist.github.com/497844 –

+0

Mi error. Tienes razón. ¿Tienes alguna explicación de por qué para 'let func (a: float seq) = 5.' no tenemos que hacer upcasting y por seq seq tenemos que hacer eso? –

Cuestiones relacionadas