Structural subtyping, Upper bounds, Implicite Parameter & View bounds
Scala에서 insertion sort는 다음과 같이 구현할 수 있습니다. def isort[T](less:(T,T)=>Boolean)(xs:List[T]):List[T] = { def insert(x:T, xs:List[T]):List[T] = xs match { case Nil => List(x) case x1::xs1 => if (less(x, x1)) x::xs else x1::insert(x, xs1) } xs match { case Nil => Nil case x::xs1 => insert(x, isort(less)(xs1)) } } println(isort((x:Int, y:Int)=> x x Int형이라면 < 연산자를 사용하고 비교하기 위해 less 연산자를 사용하지 않겠지만 Double이나 Char를 정렬하고 싶은 경우도 생기기 때문에 일반적인 형 T에 대해 사용할 수 있도록 적은 것입니다. 하지만 Double, Char 모두 < 연산자를 제공하고 있는데 반복적인 less를 사용하는 것이 불편합니다. Programming Scala 책에는 structural subtype 에 대해 클래스 이름이 아니라 특정한 메소드를 가지는 것으로 subtype을 결정하는 것이라고 나와 있습니다. 다음과 같이 시도해 봅니다. def isort2[T List(x) case x1::xs1 => if (x Nil case x::xs1 => insert(x, isort(xs1)) } } 위에서 의미하고자 하는 것은 같은 형과 비교하는 연산자 <를 가지는 클래스 T를 말하는 것입니다만, structural subtype에서는 아직 정의되지 않은 T를 사용할 수 없다며 컴파일 오류가 발생합니다. 다른 형의 메소드라면 이 방법으로 해결할 수 있었겠지만 같은 형을 비교해서 Boolean을 반환하는 함수형은 이 방법을 사용할 수 없습...