나는 이런 식으로 뭔가를 달성하기 위해 노력하고있어 티.기본 클래스에 일치하는 패턴 및 스칼라
기본적으로 유형/특성에 대해 일치 시키며 해당 유형/특성을 파생/구현하고 특성을 Seq로, 유형 매개 변수를 미리 알고있는 모든 개체를 포함하고자합니다. 저는 스칼라 초보자이기 때문에 저는 아주 붙어 있습니다.
아이디어가 있으십니까?
나는 이런 식으로 뭔가를 달성하기 위해 노력하고있어 티.기본 클래스에 일치하는 패턴 및 스칼라
기본적으로 유형/특성에 대해 일치 시키며 해당 유형/특성을 파생/구현하고 특성을 Seq로, 유형 매개 변수를 미리 알고있는 모든 개체를 포함하고자합니다. 저는 스칼라 초보자이기 때문에 저는 아주 붙어 있습니다.
아이디어가 있으십니까?
유형 삭제로 인해 매개 변수화 된 유형을 검사 할 수 없습니다. 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
* 매개 변수화 된 유형을 확인할 수 없습니다. * 예외가 하나 있습니다. - 배열 –
내 생각은 당신이 잘못하고 있다는 것입니다. 패턴 일치 대신 형식 클래스 또는 형식 기반 동적 디스패치를 수행 할 수있는 다른 메커니즘 (클래스 메서드)이 필요합니다. 패턴 매칭을 사용하여 자신 만의 타입 기반 디스패치를 수행하면 지저분한 코드가 발생하고 유형 안전을 방해합니다.
다음은 스칼라에서 유형 클래스의 빠르고 일반적인 예입니다. 첫째, 유형의 클래스가 공통으로 가지고있는 특성 정의 : 귀하의 경우에는
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
}
나는 Int
내 Ord
형 클래스의 인스턴스했습니다. 이제 형식 클래스에서 제공하는 인터페이스에 의존하는 메서드를 작성할 수 있습니다. 방법과 같이, 암시 적으로 특정 유형의 클래스 객체를 받아 들여야한다 : 당신이 내재 된 객체를 호출하여 유형 클래스의 특별한 방법을 사용할 수있다
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 인스턴스가없는 목록을 정렬하려고합니까? 컴파일러는 발에서 자신을 쏘지 못하게 할 것입니다.
글쎄, 나는 너를 모른다. 그러나 확실히 여기에'x'가 인쇄되어있다. –