Похоже, ошибка. Об ошибках следует сообщать здесь: https://github.com/scala/bug/issues
Я попытался создать минимальный пример.
И, возможно, я упростил пример, но теперь у меня есть проблемы даже с HNil
case.
Для
import cats.Applicative
import shapeless.{::, HList, HNil}
import cats.instances.option._
trait Sequencer[L <: HList] extends Serializable {
type F[_]
}
object Sequencer {
type Aux[L <: HList, F0[_]] = Sequencer[L] {
type F[X] = F0[X]
}
implicit def nil[F0[_]](
implicit F: Applicative[F0]
): Aux[HNil, F0] = null
}
implicitly[Sequencer.Aux[HNil, Option]]
компилируется, но implicitly[Sequencer[HNil]{type F[X] = Option[X]}]
не делаетt и есть предупреждение (scalacOptions += "-Xlog-implicits"
)
//Information: App.this.Sequencer.nil is not a valid implicit value for App.Sequencer[shapeless.HNil]{type F[X] = Option[X]} because:
//hasMatchingSymbol reported error: could not find implicit value for parameter F: cats.Applicative[Option[X]]
И, вероятно, здесь мы можем увидеть причину: could not find implicit value for parameter F: cats.Applicative[Option[X]]
должно быть could not find implicit value for parameter F: cats.Applicative[Option]
.
Но по какой-то причине, если я удалюimplicit F: Applicative[F0]
затем для
import shapeless.{::, HList, HNil}
trait Sequencer[L <: HList] extends Serializable {
type F[_]
}
object Sequencer {
type Aux[L <: HList, F0[_]] = Sequencer[L] {
type F[X] = F0[X]
}
implicit def nil[F0[_]](): Aux[HNil, F0] = null
}
implicitly[Sequencer.Aux[HNil, Option]]
не компилируется, хотя implicitly[Sequencer.Aux[HNil, Option]](Sequencer.nil())
компилируется.
implicitly[Sequencer[HNil]{type F[X] = Option[X]}]
тоже не компилируется. И если мы напишем implicitly[Sequencer[HNil]{type F[X] = Option[X]}](Sequencer.nil())
, мы увидим, почему
//Error: inferred kinds of the type arguments (Option[X]) do not conform to the expected kinds of the type parameters (type F0).
//Option[X]'s type parameters do not match type F0's expected parameters:
//class Option has one type parameter, but type F0 has one
... has one type parameter, but ... has one
показывает, что это ошибка.
Отслеживание ошибок показывает открытые проблемы для "неявных" и "высшихвид "
https://github.com/scala/bug/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+implicit+higher-kind