Я хотел бы повторно использовать существующие экстракторы и составить их. 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
Интернет говорит, что ожидаемое поведение из-за типа стирания.
Можно ли перефразировать код, чтобы он работал правильно?
И как я мог бы соответствовать регулярному выражению экстрактор, например, чтобы вновь определенного типа 'Extractor'? – ayvango
@ayvango Не могли бы вы вставить средство выделения регулярных выражений? – chengpohi
'val date =" "" (\ d \ d \ d \ d) - (\ d \ d) - (\ d \ d) "" ". R' Существует множество других предопределенных экстракторов. И я хотел бы их повторно использовать. – ayvango