習作:数字混じり文字列ソートをF#で

まだ文法とか半分くらいしか学んでないけど、リスト操作を憶えたので今の知識でどんな風になるか腕試し。
元ネタはどう書く?.org 「数字混じり文字列ソート」

open System

let takeNums cs =
    let rec loop cs n =
        match cs with
        | [] -> (n, [])
        | c::cs when Char.IsDigit c -> loop cs (string c |> Int32.Parse |> ((+) (n*10)))
        | c::cs -> (n, c::cs)
    loop cs 0

let takeChars cs =
    let rec loop cs s =
        match cs with
        | [] -> (s, [])
        | c::cs when Char.IsDigit c -> (s, c::cs)
        | c::cs -> loop cs (s + (string c))
    loop cs ""

let parse (s:string) =
    let rec loop cs list =
        match cs with
        | [] -> list
        | _ ->  let s, cs = takeChars cs
                let n, cs = takeNums cs
                loop cs (List.append list [(s, n)])
    loop (s.ToCharArray() |> Array.toList) [] 

//let mixedSort = List.sortWith (fun a b -> compare (parse a) (parse b))

let mixedSort = List.sortBy parse

多分冗長なんだろうね、これじゃ。
書いた後で気付いたけど、末尾再帰にしないほうがシンプルになったかも?

追記

List モジュールに take とか drop とか無くて不便だなぁーと思いながら書いてたけど、
どうやら Seq モジュールにそういった関数があるみたいだ。

さらに追記

sortBy 使うべきでしたね。コード訂正。