2016-10-09 8 views
1

配列をリストに変換することで配列を整理する関数を作成しました(少し愚かかもしれませんが、それは私の解決策です)。とにかく、他の同様のソート関数のような型では表示されません。 sort : (’a [] -> ’a []) when ’a : comparisonのようにしたいと思います。私の行く:Arraysort f#は欲しい型を与えていません

val arraySort : array:int [] -> int [] 
val it : unit =() 
+4

それは 'として示しています(それは本当に効率的ではないのですが)物事はもう少し慣用的に書き込むことができるアルゴリズムを変更せずに、言っ

let rec putNumber (thelist, value) = match thelist with | [] -> [value] | x :: xs -> if value <= x then [value; x] @ xs else x :: putNumber (xs, value) let sort array = let rec sortList array blist index = let clist = putNumber (blist, Array.get array index) if index < Array.length array - 1 then sortList array clist (index + 1) else clist List.toArray (sortList array [] 0) 

を:これらの関数与え

のint [] 'これはあなたがそれを宣言した方法: 'let sort(array:int [])='。どうしたの? –

+4

あなたの引数 'array'の型が** int ** [] – Sehnsucht

+0

であることを明示的に述べています。しかし、 'a:比較するときは' a [] - > 'a'それ、どうやったら出来るの? – alexanderson

答えて

3

最初のステップ、すべてのタイプの注釈を削除します。あなたは通常、必要な時にのみそれを入れます(つまり、推論が少しの助けなしに物を決めることができないときなど) 2番目のステップは、モジュール内の関数(ここでは配列モジュール)を使って推論することができます

let rec putNumber value = function 
    | []      -> [value] 
    | x :: xs when value <= x -> [value; x] @ xs 
    | x :: xs     -> x :: putNumber value xs 

let sort array = 
    let len = Array.length array 

    let rec sortList blist index = 
    let value = Array.get array index 
    let clist = putNumber value blist 

    if index < len - 1 
    then sortList clist (index + 1) 
    else clist 

    sortList [] 0 
    |> List.toArray 
関連する問題