2016-12-30 14 views
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 _) 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^