urs*_*rso 24 scala structural-typing
我在一些代码中需要一些递归结构类型,使用特征和结构类型作为类型参数约束.它工作正常,但后来我了解到Scala不支持递归结构类型.
那么有人可以解释为什么这样可行:
scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {}
defined trait Test
Run Code Online (Sandbox Code Playgroud)
而这不是:
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
Run Code Online (Sandbox Code Playgroud)
我认为这是编译器中的一个小故障.以下代码表现出与初始代码相同的行为:
trait Test[M[A] <: { def map: M[A] } ] {}
def test[M[A] <: { def map: M[A] } ] = null
Run Code Online (Sandbox Code Playgroud)
它导致编译时错误:'非法循环引用'.
并且以下代码没有(即它编译好):
type S[M] = { def map: M }
trait Test[M[A] <: S[M[A]] ] {}
def test[M[A] <: S[M[A]] ] = null
Run Code Online (Sandbox Code Playgroud)
唯一的区别是结构类型是通过类型别名S在这里应用的.
| 归档时间: |
|
| 查看次数: |
1338 次 |
| 最近记录: |