24

我需要在某些代码中使用带有特征和结构类型作为类型参数约束的一些递归结构类型。它工作得很好,但后来我了解到 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
4

2 回答 2

6

我认为这是编译器中的一个小故障。以下代码表现出与您的初始代码相同的行为:

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 应用的。

于 2010-11-16T21:36:10.293 回答
0

第一个代码片段也在 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?

于 2010-11-09T18:39:39.933 回答