既存のエクストラクターを再利用して構成したいと考えています。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
インターネットは、型消去による予想される動作であると言います。
正しく動作するようにコードを書き換えることは可能ですか?