¿Por qué es posible asignar lambdas recursivas a vals no perezosos en Scala?
En la siguiente declaración el valf
se define como una lambda que se hace referencia a sí misma (es recursiva):
val f: Int => Int = (a: Int) =>
if (a > 10) 3 else f(a + 1) + 1 // just some simple function
Lo he intentado en REPL, y se compila y ejecuta correctamente.
Según la especificación, esto parece una instancia de referencia directa ilegal:
En una secuencia de afirmacións[1]...s[n]
formando un bloque, si un nombre simple ens[i]
se refiere a una entidad definida pors[j]
dóndej >= i
, entonces para todoss[k]
entre e incluyendos[i]
ys[j]
,
s[k]
No puede ser una definición variable.Sis[k]
es una definición de valor, debe serlazy
.La asignación es una sola declaración, por lo que satisfizo elj >= i
criterios, y se incluye en el intervalo de declaraciones a las que se aplican las dos reglas (entre e incluyendos[i]
ys[j]
)
Sin embargo, parece que viola la segunda regla, porquef
No es vago.
¿Cómo es eso una declaración legal (lo probé en Scala 2.9.2)?