Забавное наблюдение о (рекурсивных) структурных типах в Scala - PullRequest
24 голосов
/ 04 сентября 2010

Мне нужен был некоторый рекурсивный структурный тип в некотором куске кода, использующий черты и структурный тип в качестве ограничения параметра типа.Это работало нормально, но позже я узнал, что Scala не поддерживает рекурсивные структурные типы.

Поэтому кто-то может объяснить мне, почему это работает нормально:

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

, а это не так:

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

Ответы [ 2 ]

6 голосов
/ 17 ноября 2010

Я думаю, что это сбой в компиляторе. Следующий код демонстрирует то же поведение, что и ваш исходный код:

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

Это приводит к ошибке времени компиляции: «недопустимая циклическая ссылка».

А следующий код не (т.е. он прекрасно компилируется):

type S[M] = { def map: M }

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

Единственное отличие состоит в том, что структурная типизация применяется через псевдоним типа S здесь.

0 голосов
/ 09 ноября 2010

Первый фрагмент кода также выдает ошибку в 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] } ] {}
                                                    ^

Какую версию Scala вы используете?

...