Ответ 1
Да, это так, но ваш связанный с контуром тип должен иметь более высокий тип сортного типа (который не работает ClassManifest).
scala> trait HKTypeClass[CC[_]]
defined trait HKTypeClass
scala> implicit def listHKTC = new HKTypeClass[List] {}
listHKTC: java.lang.Object with HKTypeClass[List]
scala> def frob[CC[_] : HKTypeClass] = implicitly[HKTypeClass[CC]]
frob: [CC[_]](implicit evidence$1: HKTypeClass[CC])HKTypeClass[CC]
scala> frob[List]
res0: HKTypeClass[List] = [email protected]
Обновление
Можно использовать псевдоним типа, позволяющий ограничить тип более высокого типа типом связанного типа первого порядка. Мы используем псевдоним типа как функцию уровня типа, чтобы сделать тип более высокого типа из типа первого порядка. Для ClassManifest он может выглядеть следующим образом:
scala> type HKClassManifest[CC[_]] = ClassManifest[CC[_]]
defined type alias HKClassManifest
scala> def frob[CC[_] : HKClassManifest] = implicitly[HKClassManifest[CC]]
test: [CC[_]](implicit evidence$1: HKClassManifest[CC])HKClassManifest[CC]
scala> frob[List]
res1: HKClassManifest[List] = scala.collection.immutable.List[Any]
Обратите внимание, что с правой стороны типа alias CC [_] является типом первого порядка... подчеркивание здесь является подстановочным знаком. Следовательно, он может использоваться как аргумент типа для ClassManifest.
Обновление
Для полноты я должен отметить, что псевдоним типа может быть встроен с использованием типа лямбда,
scala> def frob[CC[_] : ({ type λ[X[_]] = ClassManifest[X[_]] })#λ] = implicitly[ClassManifest[CC[_]]]
frob: [CC[_]](implicit evidence$1: scala.reflect.ClassManifest[CC[_]])scala.reflect.ClassManifest[CC[_]]
scala> frob[List]
res0: scala.reflect.ClassManifest[List[_]] = scala.collection.immutable.List[Any]