Mã này biên dịch với Scala 2.9.2:lỗi Strange với các loại cao kinded trong scala 2.10.0 (chỉ hoạt động với scala 2.9.2)
trait HK {
type Rep[A]
def unzip1[A, B, C[_]](ps: Rep[C[(A, B)]]): (Rep[C[A]], Rep[C[B]])
def doUnzip1[A, B](ps: Rep[List[(A, B)]]) = unzip1(ps)
}
Nhưng với Scala 2.10.0 nó không biên dịch với lỗi sau (tính năng ngôn ngữ được bật cao hơn được bật):
[info] Compiling 1 Scala source to /home/klyuchnikov/code/hk/target/scala-2.10/classes...
[error] /home/klyuchnikov/code/hk/src/main/scala/HK.scala:6: type mismatch;
[error] found : HK.this.Rep[List[(A, B(in method doUnzip1))]]
[error] required: HK.this.Rep[List[((A, B(in method doUnzip1)), B(in method unzip1))]]
[error] def doUnzip1[A, B](ps: Rep[List[(A, B)]]) = unzip1(ps)
Điều gì xảy ra ở đây? Những thay đổi trong các loại cao cấp trong Scala 2.10 là gì?
P.S. Nếu tôi vượt qua các thông số loại một cách rõ ràng, sau đó mã này biên dịch:
trait HK {
type Rep[A]
def unzip1[A, B, C[_]](ps: Rep[C[(A, B)]]): (Rep[C[A]], Rep[C[B]])
def doUnzip1[A, B](ps: Rep[List[(A, B)]]) = unzip1[A, B, List](ps)
}
Trông giống như một lỗi trong suy luận kiểu. Dường như A trong unzip1 được suy ra để có loại (A, B) mà là thực sự kỳ lạ. –