2012-03-24 6 views
0

Hier ist, was ich bisher:Wie schreibt man einen "generischen" Mergesort in Scala?

def mergesort[T <: Ordered[T]](elements : List[T]) : List[T] = { 
    def merge(first : List[T], second : List[T]) : List[T] = (first, second) match { 
     case (Nil, _) => second 
     case (_, Nil) => first 
     case (x :: xs, y :: ys) => if (x < y) x :: merge(xs, second) else y :: merge(first, ys) 
    } 

    if (elements.isEmpty) Nil 
    else { 
     val length = elements.length 
     val (firstHalf, secondHalf) = elements.splitAt(length/2) 

     merge(mergesort(firstHalf), mergesort(secondHalf)) 
    } 
    } 

Das Problem, das ich ist, die ich, dass diese

mergesort(List(1, 3, 6, 3, 1, 0)) 

error: inferred type arguments [Int] do not conform to method mergesort's type parameter bounds [T <: Ordered[T]] 
     mergesort(List(1, 3, 6, 3, 1, 0)) 
    ^

Gibt es nicht eine Möglichkeit, diese Arbeit für alle Arten zu machen, die bestellt werden? Ich würde zwar Scala eine Art implizite Umwandlung zu einem 'reichen' Integer-Typ haben, von dem ich annahm, dass er das Ordered Merkmal hätte.

+1

Hier finden Sie einige Tipps: http://StackOverflow.com/Questions/6929637/Selection-Sort-Generic-Type-Implementierung – huynhjl

Antwort

2

Was Sie brauchen, ist eine Ansicht gebunden def mergesort[T <% Ordered[T]]. Siehe Antworten auf diese Frage: Generic method to return first of two values.

Dies wird nun ausgeführt, aber Sie haben einige Fehler in Ihrem Algorithmus, die Ihnen einen Stackoverflow-Fehler in der splitAt Zeile geben.