Я использовал =:=
как пример типа лямбда для создания простого минимального примера.
=:=
введите два аргумента, я хотел бы сделать один на уровне уровня.
Я принимаю наивную реализацию type Curry[G] = {type l[L] = L =:= G}
, но в практических целях он вызывает ошибки:
type X = Int
type Y = Int
type CurryInt[T] = T =:= Int
type Curry[G] = {type l[L] = L =:= G}
type CurrStatic = {type l[L] = L =:= Int}
object CurryObj {type l[L] = L =:= Int}
trait Apply[P[_], T]
implicit def liftApply[P[_], T](implicit ev : P[T]) = new Apply[P,T] {}
implicitly[Apply[CurryInt, Y]] // ok
implicitly[Apply[Curry[X]#l, Y]] // fails
implicitly[Apply[Curry[X]#l, Y]](liftApply) // fails
implicitly[Apply[Curry[X]#l, Y]](liftApply[Curry[X]#l, Y]) // ok
implicitly[Apply[CurrStatic#l, Y]] // fails
implicitly[Apply[CurryObj.l, Y]] // ok
Здесь выводится вывод типа. Как определить тип lambdas, чтобы он работал?