2016-12-30 44 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

相关问题