关于Scala中(递归)结构类型的有趣观察
-
30-09-2019 - |
题
我需要在某些代码中使用特征和结构类型作为类型的参数约束,在某些代码中需要一些递归结构类型。它运行良好,但后来我得知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
解决方案
我认为这是编译器中的故障。以下代码表现出与您的初始代码相同的行为:
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
唯一的区别是,在此处通过类型的别名应用结构键入。
其他提示
第一个代码段还会在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?
不隶属于 StackOverflow