是否可以接受任意提取器作为方法参数

时间:2016-12-30 07:36:41

标签: scala type-parameter extractor structural-typing

我想重用现有的提取器并将它们组合起来。 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

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

是否可以重新编写代码以使其正常工作?

1 个答案:

答案 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)
}