복붙노트

[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. ==============================

    1.이 스칼라 내가 (사업자와 아마 후 세미콜론 추론 관련 문제) 생각할 수있는 개는 가장 성가신 중 하나입니다. 당신은 정답에서 세 개의 문자이야.

    이 스칼라 내가 (사업자와 아마 후 세미콜론 추론 관련 문제) 생각할 수있는 개는 가장 성가신 중 하나입니다. 당신은 정답에서 세 개의 문자이야.

    문제는 병합의 type 매개 변수입니다. 그것은 새로운 T를 소개하고 그 그림자 종류의 T 유형 매개 변수. 컴파일러는 그러므로 그 비교는 그 새로운 T.의 인스턴스에 적용 할 수있는 모르는 할 수 있습니다 보스 주위 이유는 첫 번째 버전의 작품이지만, 그렇지 않으면 빈 슬레이트로 그 T를 보는 캐스트와.

    그냥 처음 데프 병합 (쓰기 : 목록 [T]를, ... 당신은 괜찮을거야.

  2. from https://stackoverflow.com/questions/13830279/generic-type-inference-in-scala by cc-by-sa and MIT license