scala - F-bounded existential quantification -


i came across existential quantification f-bounded types while trying understand scala's type system.

let a type

trait a[f <: a[f]] { self: f => } 

where f f-bounded self-type of a.

and b subtype of a

case class b() extends a[b] 

if try declare list of a existential quantification

val a: list[t] forsome { type t <: a[t] }  

i error when assigning a list of b. reason scala infers type list[a[nothing]].

val a: list[t] forsome { type t <: a[t] } = list(b()) // type mismatch 

when applying simplification rule 4 (as described in scala-spec) covariant occurrence of t may replaced upper bound (here: a[t])

val b: list[a[t]] forsome { type t <: a[t] } = list(b()) 

both examples should equivalent (if have not misunderstood something), simplified 1 works fine. furthermore following correct , should equivalent:

val c: list[t forsome { type t <: a[t] }] = list(b()) 

but reason type of c , type of b not equal.

so question is: bug of scala compiler or did misunderstand crucial?

edit: assumption correct, types of c , b not equal, because existential quantification in c not see covariant occurrence of t?


Comments

Popular posts from this blog

sql - invalid in the select list because it is not contained in either an aggregate function -

Angularjs unit testing - ng-disabled not working when adding text to textarea -

How to start daemon on android by adb -