我使用=:=
作爲示例類型lambda來進行簡單的最小示例。如何正確定義lambda類型?
=:=
類型有兩個參數,我想在類型級別咖喱一個。
我把幼稚的做法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
類型推斷打破這裏。我應該如何定義類型lambda來使其工作?
不久:不使用類型投影。類型聲明允許有未綁定的變量 – ayvango
您對於您的需求沒有具體說明,但是此解決方案編譯爲什麼要嘗試使用「類型投影」?這只是一個練習嗎? – pedromss
我忘記了類型表達式中允許使用未綁定的類型。所以我試圖在類型級別編碼像'λx.λy.x== y'這樣的東西。我無法想象那個簡單的'λx.x== y'會是正確的scala表達式。 – ayvango