6

:エラーメッセージの重要な部分を指摘してくれたので、重要な部分をもう少し抽出することができたし、Existential Typesのようです。私が理解していると、§3.2.10存在する数値の上の存在量が正しくの場合、val m: Map[x.type#S, x.type#S] forSome { val x: T }val m: Map[t#S, t#S] forSome { type t <: T with Singleton }の省略形です。しかし、下のコードでは、彼らは異なった振る舞いをしています。パスに依存する型パラメータによる関数のオーバーライド

trait Type { 
    type S 
} 

class Concrete extends Type { 
    type S = Double 
} 

trait BaseWorks { 
    type T <: Type 
    val m: t#S forSome { type t <: T with Singleton } 
} 

class Works extends BaseWorks { 
    override type T = Concrete 
    override val m = 0.0 
} 

trait BaseError { 
    type T <: Type 
    val m: x.type#S forSome { val x: T } 
} 

class Error extends BaseError { 
    override type T = Concrete 
    override val m = 0.0 
} 

BaseErrorを精製すると、エラーerror: overriding value m in trait BaseError of type Error.this.x.S forSome { val x: => Error.this.T }; value m has incompatible typeにつながりながら、BaseWorks作品の絞り込み。私は§3.2.10を誤解していますか?

オリジナルポスト:Scalaの次のコードでは、コンパイラ(2.9.0.1)はDerivedで何を上書きしますf2その方法を言って、エラーを生成します。一方

abstract trait Type { 
    type T1 
    type T2 
    type P = (T1, T2) 
} 

class ConcreteType extends Type { 
    type T1 = Double 
    type T2 = Double 
} 

abstract class Base { 
    type T <: Type 
    type TP = T#P 
    def f1(v: TP): TP 
    def f2(v: T#P): T#P 
    def f3(v: T#P): T#P 
} 

class Derived extends Base { 
    override type T = ConcreteType 
    override def f1(v: TP): TP = v 
    override def f2(v: T#P): T#P = v 
    override def f3(v: TP): TP = v 
} 

、コードの動作に示すようとまったく同じ署名を機能f3をオーバーライドします。私は、両方の関数が同じように動作することを期待します。なぜこれは当てはまりませんか?

+0

Scalaコンパイラhttps://issues.scala-lang.org/browse/SI-4914でバグを発見しました。 –

答えて

5

(ちなみに、私は2.9.0.1を使用しています)

私はスペックでこの理由を見つけることができませんでしたが、あなたが取得するエラーメッセージは、少なくとも、究極の理由は明確になります。

(Note that (_5.T1, _5.T2) forSome { val _5: Base.this.T } 
does not match 
(_16.T1, _16.T2) forSome { val _16: Base#T } 

Base.this.TBase#Tと同等ではありません。これは重要な部分です。前者はインスタンスthisに基づくパス依存型であり、後者はインスタンスベースではない型投影です。

これは、型解決の順序が原因であるようです。 TPは、Baseの評価に関して解決され、T#Pは、Derivedの評価に関して解決される。

誰かがこれを正しく説明できる場所を指し示すことができるなら、私はそれを読むのが大好きです。

+0

こんにちはデレク。キーパーツを指摘してくれてありがとう。私はもう少し重要な部分を抽出することができました。上記の投稿を更新します。 –

関連する問題