Created
July 1, 2018 21:07
-
-
Save kmizu/1e8276f8dfa1885e8ad918d588554d6a to your computer and use it in GitHub Desktop.
Scala's existential type cannot emulate Java's Wildcard
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Undecidable.scala:6: error: illegal cyclic reference involving trait E | |
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]] | |
^ | |
Undecidable.scala:6: error: E does not take type parameters | |
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]] | |
^ | |
Undecidable.scala:8: error: illegal cyclic reference involving trait Qr | |
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]] | |
^ | |
Undecidable.scala:8: error: E does not take type parameters | |
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]] | |
^ | |
Undecidable.scala:6: error: E does not take type parameters | |
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]] | |
^ | |
Undecidable.scala:6: error: not found: type < | |
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]] | |
^ | |
Undecidable.scala:7: error: illegal cyclic reference involving trait Ql | |
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]] | |
^ | |
Undecidable.scala:7: error: E does not take type parameters | |
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]] | |
^ | |
Undecidable.scala:10: error: type mismatch; | |
found : Qr[_$21] where type _$21 >: E[_ >: E[_ >: Z]] | |
required: L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]] | |
Note: _$21 <: Any, but trait L is invariant in type X. | |
You may wish to define X as +X instead. (SLS 4.5) | |
def doIt(v: Qr[_ >: E[_ >: E[_ >: Z]]]): L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]] = v | |
^ | |
9 errors found |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
trait Z | |
trait N[X] | |
trait L[X] | |
trait Qlr[X] | |
trait Qrl[X] | |
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]] | |
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]] | |
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]] | |
object Undecidable { | |
def doIt(v: Qr[_ >: E[_ >: E[_ >: Z]]]): L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]] = v | |
} | |
/* | |
interface Z {} interface N<x> {} interface L<x> {} | |
interface Qlr<x> {} interface Qrl<x> {} | |
interface E<x> extends | |
Qlr<N<?super Qr<?super E<?super E<?super x>>>>>, | |
Qrl<N<?super Ql<?super E<?super E<?super x>>>>> {} | |
interface Ql<x> extends | |
L<N<?super Ql<?super L<?super N<?super x>>>>>, | |
E<Qlr<?super N<?super x>>> {} | |
interface Qr<x> extends | |
L<N<?super Qr<?super L<?super N<?super x>>>>>, | |
E<Qrl<?super N<?super x>>> {} | |
class Main { | |
L<?super N<?super L<?super N<?super L<?super N<?super | |
E<?super E<?super Z>>>>>>>> | |
doit(Qr<? super E<? super E<? super Z>>> v) {return v;} | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment