習作:数字混じり文字列ソートを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 使うべきでしたね。コード訂正。