Je souhaite réutiliser des extracteurs existants et les composer. A => Option[B]
correspond parfaitement à B => Option[C]
.Est-il possible d'accepter un extracteur arbitraire comme argument de méthode?
Mais je suis confus, comment pourrais-je exprimer une telle relation dans le code.
La manière évidente n'est pas disponible pour une bonne raison:
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 réponse:
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
Internet indique qu'il est le comportement attendu en raison de l'effacement de type.
Est-il possible de reformuler le code pour qu'il fonctionne correctement?
Et comment pourrais-je répondre extracteur regex par exemple le type nouvellement défini 'Extractor'? – ayvango
@ayvango Pourriez-vous coller votre extracteur d'expressions régulières? – chengpohi
'val date =" "" (\ d \ d \ d \ d) - (\ d \ d) - (\ d \ d) "" ". R' Il y a beaucoup d'autres extracteurs prédéfinis. Et j'aimerais les réutiliser. – ayvango