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
È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top