torres recursividad recursivas programacion las juego informatica hanoi funciones entendiendo ejemplos con scala structural-typing

recursividad - Observación divertida sobre tipos estructurales(recursivos) en Scala



recursividad informatica (2)

Necesitaba algún tipo de estructura recursiva en algún fragmento de código con rasgos y el tipo de estructura como restricción de parámetro de tipo. Funcionó bien, pero luego supe que Scala no admite tipos estructurales recursivos.

Entonces, ¿puede alguien explicarme por qué esto funciona bien?

scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {} defined trait Test

y esto no:

scala> def test[M[A] <: { def map[B](f: A => B) : M[B] } ] = null <console>:5: error: illegal cyclic reference involving type M def test[M[A] <: { def map[B](f: A => B) : M[B] } ] = null


Creo que esto es una falla en el compilador. El siguiente código exhibe el mismo comportamiento que su código inicial:

trait Test[M[A] <: { def map: M[A] } ] {} def test[M[A] <: { def map: M[A] } ] = null

Da como resultado un error de tiempo de compilación: ''referencia cíclica ilegal''.

Y el siguiente código no (es decir, compila bien):

type S[M] = { def map: M } trait Test[M[A] <: S[M[A]] ] {} def test[M[A] <: S[M[A]] ] = null

La única diferencia es que la tipificación estructural se aplica a través de un alias de tipo S aquí.


El primer fragmento de código también arroja un error en Scala 2.7.7final:

scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {} <console>:4: error: illegal cyclic reference involving type M trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {} ^

¿Qué versión de Scala usas?