2012-02-25 3 views
3
의 모든 파생 클래스는

나는 이런 식으로 뭔가를 달성하기 위해 노력하고있어 티.기본 클래스에 일치하는 패턴 및 스칼라

기본적으로 유형/특성에 대해 일치 시키며 해당 유형/특성을 파생/구현하고 특성을 Seq로, 유형 매개 변수를 미리 알고있는 모든 개체를 포함하고자합니다. 저는 스칼라 초보자이기 때문에 저는 아주 붙어 있습니다.

아이디어가 있으십니까?

+2

글쎄, 나는 너를 모른다. 그러나 확실히 여기에'x'가 인쇄되어있다. –

답변

5

유형 삭제로 인해 매개 변수화 된 유형을 검사 할 수 없습니다. Warning about an unchecked type argument in this Scala pattern match?

또 다른 질문과 답변을 어떻게 극복하는 방법을 알려 : 경고가있을 것입니다 왜이 질문을 참조 How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections? 당신이 형식 매개 변수에 대해 확인하지 않는 경우

그럼에도 불구하고 코드가 잘 작동 :

scala> List("a") match { case _: Seq[_] => 1 case _ => 2 } 
res0: Int = 1 
+4

* 매개 변수화 된 유형을 확인할 수 없습니다. * 예외가 하나 있습니다. - 배열 –

1

내 생각은 당신이 잘못하고 있다는 것입니다. 패턴 일치 대신 형식 클래스 또는 형식 기반 동적 디스패치를 ​​수행 할 수있는 다른 메커니즘 (클래스 메서드)이 필요합니다. 패턴 매칭을 사용하여 자신 만의 타입 기반 디스패치를 ​​수행하면 지저분한 코드가 발생하고 유형 안전을 방해합니다.

다음은 스칼라에서 유형 클래스의 빠르고 일반적인 예입니다. 첫째, 유형의 클래스가 공통으로 가지고있는 특성 정의 : 귀하의 경우에는

trait Ord[T] { def compare (x: T, y: T): Boolean } 

을, 당신은 a 방법은 특성의 방법으로 원하는 것입니다. 그런 다음 유형 클래스에 속하는하려는 각 유형에 대해, 그것을 암시 적 객체를 생성 : 여기

implicit object ordInt extends Ord[Int] { 
    def compare (x: Int, y: Int) = x <= y 
} 

나는 IntOrd 형 클래스의 인스턴스했습니다. 이제 형식 클래스에서 제공하는 인터페이스에 의존하는 메서드를 작성할 수 있습니다. 방법과 같이, 암시 적으로 특정 유형의 클래스 객체를 받아 들여야한다 : 당신이 내재 된 객체를 호출하여 유형 클래스의 특별한 방법을 사용할 수있다

def sort[T](xs: List[T])(implicit ord: Ord[T]) = { 

.

def sort[T](xs: List[T])(implicit ord: Ord[T]) = { 
    def insert(y: T, ys: List[T]): List[T] = ys match { 
    case Nil => List(y) 
    case z :: zs => 
     if (ord.compare(y,z)) { y::z::zs } // <--- here I use ord.compare 
     else { z :: insert(y, zs) } 
    } 
    xs.foldRight(List[T]())(insert _) 
} 

그리고 voila! 유형 안전을 잃지 않으면 서 유형 지정 파견 서비스를 제공합니다. Ints 목록을 정렬하고 싶습니까? 문제 없어. Ord 인스턴스가없는 목록을 정렬하려고합니까? 컴파일러는 발에서 자신을 쏘지 못하게 할 것입니다.

관련 문제