Хотя эта проблема была поймана в коде с использованием shapeless и kind-projector, это поведение можно было бы воспроизвести без них.Неявный не найден для частично применяемого типа
Предположим, у меня есть простой класс для переопределения экземпляров typeclass с неполной реализацией (зеркало LiftAll
).
sealed trait LiftAll1[F[_], In] {
type Out
def instances: Out
}
object LiftAll1 {
type Aux[F[_], In0, Out0] = LiftAll1[F, In0] {type Out = Out0}
implicit def unit[F[_]]: Aux[F, Unit, Unit] = new LiftAll1[F, Unit] {
type Out = Unit
def instances = Unit
}
}
И некоторые очень простой класс типа, чтобы проверить его
sealed class FirstIs[M, T]
object FirstIs {
implicit def firstIs[M, D]: FirstIs[M, (M, D)] = new FirstIs
}
Вещи хорошо, если я буду пытаться применить FirstIs
частично с помощью псевдонима и получить экземпляр с помощью LiftAll1
type FirstIsInt[D] = FirstIs[Int, D]
implicitly[LiftAll1[FirstIsInt, Unit]]
Но встроенное частичное применение типа приводит к ошибке компиляции
implicitly[LiftAll1[({type lambda[x] = FirstIs[Int, x]})#lambda, Unit]]
//Error: could not find implicit value for parameter e: LiftAll1[[x]FirstIs[Int,x],Unit]
Как можно было бы найти частично применимые модели в таких ситуациях?
Вы используете '-Ypartial-unification' на 2.12 или 2.11 scale? – Reactormonk
@Reactormonk Как-то я забыл добавить этот вариант в этот проект. Спасибо. Проблема решена. – Odomontois
@Odomontois вы должны ответить на вопрос и пометить его правильно ... вполне приемлемо ответить на ваши собственные вопросы. –