PythonでF#っぽくマージソート実装

っぽく、というかこの間のF#版をそのまま書いただけだけどw

def length(l):
    if l == []:
        return 0
    else:
        return 1 + length(l[1:])

def reverse(l):
    if l == []:
        return []
    else:
        return reverse(l[1:]) + [l[0]]

def mergesort(comp, l):
    def merge(l1, l2, res):
        if (l1, l2) == ([], []):
            return res
        elif l1 == []:
            return reverse(l2) + res
        elif l2 == []:
            return reverse(l1) + res
        else:
            if comp(l1[0], l2[0]) < 1:
                return merge(l1[1:], l2, [l1[0]] + res)
            else:
                return merge(l1, l2[1:], [l2[0]] + res)
    def split(l, n):
        def split2(l, left, c):
            if l != []:
                if c < n:
                    return split2(l[1:], [l[0]] + left, c+1)
                else:
                    return (reverse(left), l)
            else:
                raise Exception("invalid list")
        return split2(l, [], 0)
    if l == [] or length(l) == 1:
        return l
    else:
        m = length(l) / 2
        left, right = split(l, m)
        return reverse(merge(mergesort(comp, left), mergesort(comp, right), []))