2016-12-30 65 views
0

我想重用現有的提取器並撰寫它們。 完美匹配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

參數類型可以不指代refinement`

之外定義抽象類型作爲錯誤叫喚,用於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) 
} 
+0

而且我怎麼可能例如正則表達式提取匹配新定義的類型'Extractor'? – ayvango

+0

@ayvango你可以粘貼你的正則表達式提取器嗎? – chengpohi

+0

'val date =「」「(\ d \ d \ d \ d) - (\ d \ d) - (\ d \ d)」「」r' 還有其他一些預定義的提取器。我想重複使用它們。 – ayvango

相關問題