J'ai utilisé =:=
comme exemple de type lambda dans le but de faire un exemple minimal simple. TapezComment définir correctement le type lambda?
=:=
tapez deux arguments, je voudrais en écrire un au niveau du type.
Je prends la mise en œuvre naïve type Curry[G] = {type l[L] = L =:= G}
mais utilise en pratique, il provoque des erreurs:
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
inférence de type casse ici. Comment devrais-je définir le type lambdas pour le faire fonctionner?
brièvement: n'utilise pas la projection de type.Les déclarations de type peuvent avoir des variables non liées – ayvango
Vous n'étiez pas spécifique quant à vos besoins, mais cette solution compile pourquoi essayez-vous d'aller avec la 'projection de type'? Est-ce juste un exercice? – pedromss
J'étais inconscient que les types non liés sont autorisés dans l'expression de type. J'ai donc essayé d'encoder quelque chose comme 'λx.λy.x == y' au niveau du type. Je ne pouvais pas imaginer que le simple 'λx.x == y' serait une expression correcte de scala. – ayvango