タイプ「種類」に問題があります:
trait Sys[ S <: Sys[S]]
trait Expr[S <: Sys[S], A]
trait Attr[S <: Sys[S], A[_]]
def test[ S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
これは失敗します
error: kinds of the type arguments (S,[x <: Sys[x]]Expr[x,Int]) do not conform
to the expected kinds of the type parameters (type S,type A) in trait Attr.
[x <: Sys[x]]Expr[x,Int]'s type parameters do not match type A's expected parameters:
type x's bounds <: Sys[x] are stricter than type _'s declared bounds >: Nothing <: Any
def test[S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ???
^
宣言された境界の問題は何ですか? その cr*ppy 部分的に適用された型を の型コンストラクターに運ぶ必要がありtrait Attr
ますか? なぜ?の定義に触れずにこれを修正できますAttr
か?
test
実装が機能するためには関数の境界が必要ですが、それらの境界を public インターフェイスに増殖させたくありませんAttr
。
注:タイプメンバー(私が望まないもの)を使用すると、機能します:
trait Attr[S <: Sys[S]] { type A[_]}
def test[ S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ???