0

既存のエクストラクターを再利用して構成したいと考えています。A => Option[B]と完全に一致しB => Option[C]ます。

しかし、私は混乱しています。そのような関係をコードでどのように表現できるでしょうか。

明らかな方法は、正当な理由で利用できません。

type Extractor[F,T] = {
  def unapply(from : F) : Option[T]
}

def bind[A,B,C](l : Extractor[A,B], r : Extractor[B,C]) = new {
  def unapply(from : A) : Option[C] = l.unapply(from).flatMap(r.unapply _)
}

scalac 応答:

Extractors.scala:7: error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
    def unapply(from : A) : Option[C] = l.unapply(from).flatMap(r.unapply _)
                ^
Extractors.scala:3: error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
    def unapply(from : F) : Option[T]
                ^
two errors found

インターネットは、型消去による予想される動作であると言います。

正しく動作するようにコードを書き換えることは可能ですか?

4

1 に答える 1

2

構造的改良のパラメータ型は、その改良の外で定義された抽象型を参照することはできません`

エラーが出る通り、forは外部で定義されstructure typeたものを参照できません。generic type

あなたの例では、次traitのように同じことを行うために使用できます。

trait Extractor[F, T] {
  def unapply(from: F): Option[T]
}

def bind[A, B, C](l: Extractor[A, B], r: Extractor[B, C]) = new Extractor[A, C] {
  override def unapply(from: A): Option[C] = l.unapply(from).flatMap(r.unapply)
}
于 2016-12-30T07:55:41.757 に答える