@@ -38,3 +38,22 @@ filter pred (x :: xs) with (pred x, filter pred xs) {
3838 filter pred (x :: xs) | (False, fxs) = fxs;
3939}
4040
41+merge : Ord a => List a -> List a -> List a;
42+merge xs [] = xs;
43+merge [] ys = ys;
44+merge (x :: xs) (y :: ys) = if (x < y) then (x :: merge xs (y :: ys))
45+ else (y :: merge (x :: xs) ys);
46+
47+sort : Ord a => List a -> List a;
48+sort [] = [];
49+sort [x] = [x];
50+sort xs = let s = split xs in
51+ merge (sort (fst s)) (sort (snd s)) where {
52+ splitrec : List a -> List a -> (List a -> List a) -> (List a, List a);
53+ splitrec (_ :: _ :: xs) (y :: ys) zs = splitrec xs ys (zs . ((::) y));
54+ splitrec _ ys zs = (zs [], ys);
55+
56+ split : List a -> (List a, List a);
57+ split xs = splitrec xs xs id;
58+}
59+