2016-12-30 10 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 

인터넷이 때문에 형의 삭제에 예상되는 동작 말한다.

제대로 작동하도록 코드를 다시 말 할 수 있습니까? structure type 외부에 정의 generic type을 참조 할 수에 대한 에러가 불러 구조적 정제에

답변

2

파라미터 타입은 refinement`

외부에서 정의 추상 타입을 참조 할 수있다. 귀하의 예를 들어, 당신이 좋아하는, 같은 일을 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)" "". r 미리 정의 된 다른 추출기가 있습니다. 그리고 나는 그들을 재사용하고 싶다. – ayvango