osservazione divertente circa (ricorsiva) tipologie strutturali a Scala
-
30-09-2019 - |
Domanda
Avevo bisogno di un certo tipo strutturale ricorsivo in qualche pezzo di codice utilizzando con tratti e il tipo strutturale, come vincolo parametro type. Ha funzionato bene, ma poi ho imparato Scala non supporta i tipi strutturali ricorsivi.
Qualcuno mi può spiegare perché questo funziona bene:
scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {}
defined trait Test
e questo non:
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
Soluzione
Penso che questo sia un problema tecnico nel compilatore. Il seguente codice presenta lo stesso comportamento come il vostro codice iniziale:
trait Test[M[A] <: { def map: M[A] } ] {}
def test[M[A] <: { def map: M[A] } ] = null
Essa si traduce in un errore di compilazione: 'riferimento ciclico illegale'.
E il seguente codice non (cioè compila bene):
type S[M] = { def map: M }
trait Test[M[A] <: S[M[A]] ] {}
def test[M[A] <: S[M[A]] ] = null
L'unica differenza è che digitando strutturale viene applicata attraverso un tipo alias S qui.
Altri suggerimenti
Il primo frammento di codice anche tiri errore nella 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] } ] {}
^
Quale versione di Scala si usa?