import scala.language.higherKinds

sealed trait Path {
  type EncodeFunc
  type Route[R] = List[String] => R

  def >>(f: Route[Int]): Sitelet[EncodeFunc] = ???
}

case object PAny extends Path {
  type EncodeFunc = List[String] => String
}

case class PLit[Next <: Path]() extends Path {
  type EncodeFunc = Next#EncodeFunc
}

trait Sitelet[EncodeFunc] { self =>
  def &[G <: H, H >: EncodeFunc](that: Sitelet[G]): Sitelet[H] = ???
}

object Test {
  val r: Sitelet[Int => (Int => String)] = ???

  val p2: PLit[PAny.type] = ???
  val r2 /*: Sitelet[List[String] => String] */ // annotate type and it compiles with 2.10.0
     = p2 >> { (xs: List[String]) => 0 }

  // This works after https://github.com/scala/scala/commit/a06d31f6a
  // Before: error: inferred type arguments [List[String] => String,List[String] => String]
  //         do not conform to method &'s type parameter bounds
  //         [G <: H,H >: Int => (Int => String)]
  val s = r & r2
}
