[SCALA] 스칼라의 일반 형식 유추
SCALA스칼라의 일반 형식 유추
사실 스칼라의 바보 병합 - 정렬 구현 다음 코드를 작성했습니다 :
import scala.collection.immutable.List
object MergeSort {
def sort[T,E]( comparator: (E,E) => Int ) (l: List[T]): List[T] = {
def merge[T](first: List[T], second: List[T]): List[T] = (first, second) match {
case (_, List()) => first
case (List(), _) => second
case (f::restFirst, s::restSecond) if comparator(f.asInstanceOf[E],s.asInstanceOf[E]) < 0 => f :: merge(restFirst, second)
case (f::restFirst, s::restSecond) => s :: merge(first, restSecond)
}
l match {
case List() => return l
case List(x) => return l
case _ => {
val (first, second) = l.splitAt( l.length / 2 )
merge( sort(comparator)(first), sort(comparator)(second) )
}
}
}
}
이것은 다음, 더 우아한 솔루션 대신입니다 :
import scala.collection.immutable.List
object MergeSort {
def sort[T]( comparator: (T,T) => Int ) (l: List[T]): List[T] = {
def merge[T](first: List[T], second: List[T]): List[T] = (first, second) match {
case (_, List()) => first
case (List(), _) => second
case (f::restFirst, s::restSecond) if comparator(f,s) < 0 => f :: merge(restFirst, second)
case (f::restFirst, s::restSecond) => s :: merge(first, restSecond)
}
l match {
case List() => return l
case List(x) => return l
case _ => {
val (first, second) = l.splitAt( l.length / 2 )
merge( sort(comparator)(first), sort(comparator)(second) )
}
}
}
}
나에게 다음과 같은 오류 메시지를주고, 어떤을 컴파일되지 않습니다 :
MergeSort.scala:10: type mismatch;
[error] found : f.type (with underlying type T)
[error] required: T
[error] case (f::restFirst, s::restSecond) if comparator(f,s) < 0 => f :: merge(restFirst, second)
왜 명시 적 캐스트는 기본 유형이 T이기 때문에 필요하다?
해결법
-
==============================
1.이 스칼라 내가 (사업자와 아마 후 세미콜론 추론 관련 문제) 생각할 수있는 개는 가장 성가신 중 하나입니다. 당신은 정답에서 세 개의 문자이야.
이 스칼라 내가 (사업자와 아마 후 세미콜론 추론 관련 문제) 생각할 수있는 개는 가장 성가신 중 하나입니다. 당신은 정답에서 세 개의 문자이야.
문제는 병합의 type 매개 변수입니다. 그것은 새로운 T를 소개하고 그 그림자 종류의 T 유형 매개 변수. 컴파일러는 그러므로 그 비교는 그 새로운 T.의 인스턴스에 적용 할 수있는 모르는 할 수 있습니다 보스 주위 이유는 첫 번째 버전의 작품이지만, 그렇지 않으면 빈 슬레이트로 그 T를 보는 캐스트와.
그냥 처음 데프 병합 (쓰기 : 목록 [T]를, ... 당신은 괜찮을거야.
from https://stackoverflow.com/questions/13830279/generic-type-inference-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] SPARK에서 왼쪽 및 오른쪽 키워드를 사용하는 방법 SQL (0) | 2019.11.24 |
---|---|
[SCALA] 타입에서 TypeTag을 얻기? (0) | 2019.11.24 |
[SCALA] 스칼라에서 어떻게 자바에서 정의 된 클래스의 동반자 객체를 정의 할 수 있습니다? (0) | 2019.11.24 |
[SCALA] 평등에 대한 스칼라 함수 값을 비교하는 방법 (0) | 2019.11.24 |
[SCALA] 스칼라 '데프 foo는 = {1}'대 '데프 foo는 {1}' (0) | 2019.11.24 |