使用fold_left进行插入排序,bool函数作为参数传递

时间:2017-11-07 21:14:50

标签: algorithm sorting ocaml

我想使用fold_left编写简单的插入排序函数,但我也希望传递将在我的排序乐趣中指定顺序的函数。 我不知道的是,如何将它传递给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 个答案:

答案 0 :(得分:1)

List.fold_left insert f ...会将insertf作为List.fold_left的单独参数。您想要的是List.fold (insert f) ...,它会将f应用于insert,然后将其结果应用于List.fold_left

编辑:此外,您无需定义less。您可以将>作为函数直接传递,将其括在括号中:insertion_sort (<) ...