2017-11-07 12 views
0

fold_leftを使用して簡単な挿入ソート関数を書いておきたいと思いますが、私のソートの楽しみの中で順序を指定する関数も渡したいと思います。私は知らない何 、私が話していますが、fold_leftが、その解決策を受け入れていないものをbool関数を引数として渡すfold_leftを使用した挿入ソート

let rec insert f l e = 
match l with 
    | [] -> [e] 
    | h :: t -> if f e h then h :: insert f t e else e :: l;; 

let insertion_sort f l = List.fold_left insert f [] l;; 

let less x y = x < y;; 

let result = insertion_sort less [2 ; 5 ; 1 ; 9 ; 7 ; -2 ; 0 ; 124];; 

この.. fold_leftするためにそれを渡す方法です。 私はsort関数を特殊化するとうまくいきます。

let insertLess = insert less;; 

let insertion_sortLess l = List.fold_left insertLess [] l;; 

let result = insertion_sortLess [2 ; 5 ; 1 ; 9 ; 7 ; -2 ; 0 ; 124];; 
# val result : int list = [124; 9; 7; 5; 2; 1; 0; -2] 

答えて

1

List.fold_left insert f ...List.fold_leftに別々の引数としてinsertfを適用します。あなたが望むのはList.fold (insert f) ...で、fからinsertまで適用され、その結果はList.fold_leftになります。

編集:さらに、lessを定義する必要はありません。 >を直接カッコで囲むことで関数として渡すことができます。insertion_sort (<) ...

+0

Thx ....私はこの1つを試したと思いますが、おそらく私は他のバグを持っています。 –

関連する問題