Ich verwendete =:=
als Beispiel Typ Lambda für den Zweck, einfache minimales Beispiel zu machen.Wie definiere ich Lambda richtig?
=:=
Geben Sie zwei Argumente ein, ich möchte eine auf Typebene curry.
Ich nehme naive Umsetzung type Curry[G] = {type l[L] = L =:= G}
aber in der Praxis verwendet es Fehler verursacht:
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
Typ-Inferenz hier bricht. Wie sollte ich den Typ lambdas definieren, damit er funktioniert?
kurz: verwendet keine Typprojektion.Die Typdeklaration darf nicht gebundene Variablen haben – ayvango
Sie waren nicht spezifisch bezüglich Ihrer Anforderungen, aber diese Lösung kompiliert, warum versuchen Sie, mit der 'Typprojektion' zu gehen? Ist es nur eine Übung? – pedromss
Ich war mir nicht bewusst, dass nicht gebundene Typen im Ausdruck type erlaubt sind. Also habe ich versucht in der Typenebene etwas wie 'λx.λy.x == y' zu kodieren. Ich könnte mir nicht vorstellen, dass das einfache 'λx.x == y 'der korrekte Ausdruck ist. – ayvango