2016-12-30 9 views
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 

インターネットはそれが原因型消去に行動を期待されていると言います。

正しく動作するようにコードを改訂することはできますか?構造精密化に

答えて

2

パラメータタイプはstructure typeが外部で定義されたgeneric typeを参照することができないため、コールアウトエラーとしてそのrefinement`

外で定義された抽象型を参照しなくてもよいです。ご例えば

、あなたは次のように、同じことを行うために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) 
} 
+0

そして、どのように私は、新たに定義されたタイプ 'Extractor'に例えば正規表現抽出と一致するだろうか? – ayvango

+0

@ayvango正規表現エクストラクタをペーストできますか? – chengpohi

+0

'val date =" ""(\ d \ d \ d) - (\ d \ d) "" "r" あらかじめ定義されている抽出プログラムがたくさんあります。そして私はそれらを再利用したいと思います。 – ayvango

関連する問題