5

のサブタイプである引数のみを受け入れる、上限Rとより高い種類の型コンストラクターによってパラメーター化される特性を定義したいと考えています。. _ _ _ _F[_]RapplyF[A]UnitA <: R

このコードは完全に正常に動作します:

import scala.language.higherKinds

// this is the trait with polymorphic `apply`
trait CoCone[R, F[_ <: R]] {
  def apply[A <: R](x: F[A]): Unit
}

// Example:
sealed trait Domain
class Dom1 extends Domain

class Fnctr[X <: Domain]

val c = new CoCone[Domain, Fnctr] {
  def apply[D <: Domain](x: Fnctr[D]): Unit = ()
}

(以下のネーミングについてのコメントを参照してください)

Rここで、あるモジュールの型メンバーとして宣言してを抽象化し、Fnctr[A <: R]このモジュール内で次のように定義するとします。

import scala.language.higherKinds

trait CoCone[R, F[_ <: R]] {
  def apply[A <: R](x: F[A]): Unit
}

trait ModuleIntf {
  type AbstractDomain
  class Fnctr[X <: AbstractDomain]
}

// No mention of an actual concrete `Domain` up to
// this point. Now let's try to implement a concrete
// implementation of `ModuleIntf`:

sealed trait Domain
class Dom1 extends Domain

object ModuleImpl extends ModuleIntf {
  type AbstractDomain = Domain
  val c = new CoCone[Domain, Fnctr] { // error [1], error [2]
    def apply[D <: Domain](x: Fnctr[D]): Unit = ()
  }
}

すべてが壊れ、解釈方法がわからない 2 つのエラー メッセージが表示されます。

[1] error: kinds of the type arguments (Domain,Main.$anon.ModuleImpl.Fnctr) do not 
conform to the expected kinds of the type parameters (type R,type F) in trait CoCone.
Main.$anon.ModuleImpl.Fnctr's type parameters do not match type F's expected parameters:
type X's bounds <: ModuleIntf.this.AbstractDomain are stricter than type _'s declared bounds <: R
      val c = new CoCone[Domain, Fnctr] {
          ^

[2] error: kinds of the type arguments (Domain,Main.$anon.ModuleImpl.Fnctr) do not 
conform to the expected kinds of the type parameters (type R,type F) in trait CoCone.
Main.$anon.ModuleImpl.Fnctr's type parameters do not match type F's expected parameters:
type X's bounds <: ModuleIntf.this.AbstractDomain are stricter than type _'s declared bounds <: R
      val c = new CoCone[Domain, Fnctr] {
              ^

コンパイラは、 3 つすべての内部ModuleImplが同じ型であることを認識すると予想していました。CoCone[Domain, Fnctr]Domain = AbstractDomain = R

ここで明らかな何かが欠けていますか、scalacそれとも 2.12.4 の制限ですか? それが制限である場合、誰かがそれをどこかで報告したことがありますか?

編集似たようなものが見つかりました: issue #10186。「同じ」ですか?同じではない"?バグの場合、別のテストケースとして提案する必要がありますか? それが完全に私のせいではないこと、および/またはそれが実際にリンクされた問題に密接に関連していることを誰かが確認できれば、それは問題の許容可能な解決策になります.

Edit2 : @Evgeny が指摘したように、別のコンパイラ フェーズ (refchecksではなくtyper) で失敗するため、正確に問題 10186 にすることはできません。


名前についての注意: ここでは、自然な変換と考えることができるCoCone一般的に定義されたものに類推して、特性と呼んでいます。~>ある意味では、は のCoCone[Dom, Fctr]ようなものですFctr ~> Const_Unitが、 のドメインは のFサブタイプに制限されていますDom。実際には、は特定のサブクラスをネットワーク経由で送信できる形式のCoCone[R, F]ものですが、それは重要ではないため、名前を抽象化しました。これはかなり一般的な数学的構造であり、あまりにも不自然ではありません。それをコンパイルできれば素晴らしいでしょう。FR

4

1 に答える 1