私はこれがすでに美しく答えられていることを知っています。ただし、Haskellのように、F#は私が考えている方法と一致し、他の初心者にもこれを追加すると思っていました:)
let rec sortData =
function
| [] -> []
| x :: xs ->
let smaller = List.filter (fun e -> e <= x) >> sortData
let larger = List.filter (fun e -> e > x) >> sortData
smaller xs @ [ x ] @ larger xs
注1:「a >> b」は関数合成であり、「apply a then apply b」のように、「fx = b(a(x))となる関数fを作成する」を意味します。 >> b >> c>>..。
注2:「@」は、[1..100] = [1..12] @ [13..50] @ [51..89] @ [90..100]のように、リストの連結です。これは、一度に1つの要素のみを追加でき、リストの先頭にのみ追加できる短所 "::"よりも強力ですが、効率が低くなります。a:: [b; c; d] = [a; b; c ; d]
注3:List.filter(fun e-> ...)式は、提供されたフィルタリングラムダを保持する「カリー化関数」バージョンを生成します。
注4:関数の代わりに「小さい」リストと「大きい」リストを作成することもできます(「xs |> filter |> sort」のように)。それらを機能させるための私の選択は恣意的でした。
注5:sortData関数の型アノテーションは、それが必要であると述べており、要素が比較をサポートするリストを返します。
_arg1:'a list -> 'a list when 'a : comparison
注6:簡潔さには明確さがあります(この特定の投稿にもかかわらず:))