trait CrashDueToTypeError { def id[a](x :a) :a = x trait Bifunctor { type a; // content type s <: Bifunctor // uncomment this-vvvvvvvvvvvvvvvvvvvvvvvvvvvv, and it compiles def bimap[c](f :a=>c) :s{/*type s=Bifunctor.this.s;*/type a=c; } } def hylo[hs <: Bifunctor,ha,hb,hc] (f :hb=>hs{type s=hs; type a=ha}, g :hs{type s=hs; type a=ha}=>hc)(x :hb) :hc = g(f(x).bimap(id)) }