我想重用现有的提取器并将它们组合起来。 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
互联网表示,由于类型擦除,这是预期的行为。
是否可以重新编写代码以使其正常工作?
答案 0 :(得分:2)
结构细化中的参数类型可能不是指在该细化“
之外定义的抽象类型
当错误调用时,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)
}