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 _)
}

斯卡拉克 回复:

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

互联网表示这是由于类型擦除而导致的预期行为。

是否可以改写代码以使其正常工作?

4

1 回答 1

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)
}
于 2016-12-30T07:55:41.757 回答