簡単な最小限の例を作成する目的で、ラムダの例として=:=
を使用しました。タイプラムダを正しく定義するには?
=:=
タイプは2つの引数を取るので、タイプレベルで1つカレーしたいと思います。
私はナイーブな実装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'が正しいスカラー表現であるとは想像できませんでした。 – ayvango