5

タイプ「種類」に問題があります:

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]} = ???
4

1 に答える 1

4

あなたが観察したように、より高い種類の型引数を提供するときに、常に境界を一致させることができるとは限りません。興味深いことに、実際には差異の問題です。

class A
class B extends A
trait NeedsNeedsA[T[S <: A]]
trait NeedsNeedsB[T[S <: B]]
trait NeedsA[S <: A]
trait NeedsB[S <: B]

def x: NeedsNeedsA[NeedsB] // fails
def y: NeedsNeedsB[NeedsA] // works

これは、より高次の型を、その引数の範囲内で反変である型の関数と考えると理にかなっています。

興味深いことに、表面上はサブタイピングによく似ている構造型では、Scala は同じエラーを出しません。

def t: MemberNeedsA { type T[S <: B] }
def u: MemberNeedsB { type T[S <: A] }

その理由は、構造型が交差点のようなものだからです。

def s: MemberNeedsA with MemberNeedsB

その交差点は実際には自然界には存在しないかもしれませんが、Scala はそれをチェックしません。

わかりましたが、それはあなたの質問にはあまり関係ありません。質問に戻りますが、分散の問題があると思います。test呼び出し元に an を返し、 anAttrAttrは型関数 ( ) があり、これにはより具体的な引数を必要とする型関数があるA[_]と言いたいとします。それが許されるべきではない理由がおわかりいただけると思います。それは、より一般的な引数を必要とする関数の代わりに、より具体的な引数を必要とする関数を代用できないのと同じ理由です。 Attr

Attrこの時点で、解決策はあなたが達成したいことに依存する必要があると思います。場合によっては型引数を他の場合よりも制限する必要がある理由を理解する必要があります。Attr「一部の s は他の s よりも制限が厳しい」ということがプログラムで概念的に意味がある場合は、次のように定義できます。

trait Attr[S <: Sys[S], B[Y <: B[Y]], A[X <: B[X]]]
def test[S <: Sys[S]]: Attr[S, Sys, L] = ...

しかし、解決策は、 の引数に対する制限が何A[_]を意味するかによって異なります。

于 2013-01-18T02:39:42.810 に答える