Jakie są ograniczenia wnioskowania o wyższych typach w Scali?

W następującym uproszczonym kodzie przykładowym:

case class One[A](a: A) // An identity functor
case class Twice[F[_], A](a: F[A], b: F[A]) // A functor transformer
type Twice1[F[_]] = ({type L[α] = Twice[F, α]}) // We'll use Twice1[F]#L when we'd like to write Twice[F]

trait Applicative[F[_]] // Members omitted
val applicativeOne: Applicative[One] = null // Implementation omitted
def applicativeTwice[F[_]](implicit inner: Applicative[F]): Applicative[({type L[α] = Twice[F, α]})#L] = null

Mogę wywołać aplikacyjną wtyczkę na aplikacyjnym jednym, a typ wnioskowania działa, jak tylko spróbuję nazwać ją aplikacyjną aplikacją (aplikacyjna), wnioskowanie kończy się niepowodzeniem:

val aOK = applicativeTwice(applicativeOne)
val bOK = applicativeTwice[Twice1[One]#L](applicativeTwice(applicativeOne))
val cFAILS = applicativeTwice(applicativeTwice(applicativeOne))

Błędy w scala 2.10.0 są

- type mismatch; 
  found : tools.Two.Applicative[[α]tools.Two.Twice[tools.Two.One,α]]
  required: tools.Two.Applicative[F]
- no type parameters for method applicativeTwice: 
  (implicit inner: tools.Two.Applicative[F])tools.Two.Applicative[[α]tools.Two.Twice[F,α]]
  exist so that it can be applied to arguments 
  (tools.Two.Applicative[[α]tools.Two.Twice[tools.Two.One,α]]) 
  --- because --- 
  argument expression's type is not compatible with formal parameter type; 
     found : tools.Two.Applicative[[α]tools.Two.Twice[tools.Two.One,α]] 
     required: tools.Two.Applicative[?F]

Dlaczego „? F” nie pasuje do niczego (odpowiedniego rodzaju)? Ostatecznie chciałbym, aby aplikacyjna technologia była niejawną funkcją, ale musiałbym najpierw uzyskać wnioskowanie typu. Widziałem podobne pytania, a odpowiedzi wskazywały na ograniczenia algorytmów wnioskowania typu. Ale ta sprawa wydaje się dość ograniczająca i musi być dość irytująca w monadowych transformatorach, więc podejrzewam, że brakuje mi jakiegoś triku do obejścia tego.

questionAnswers(2)

yourAnswerToTheQuestion