我想使用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]
答案 0 :(得分:1)
List.fold_left insert f ...
会将insert
和f
作为List.fold_left
的单独参数。您想要的是List.fold (insert f) ...
,它会将f
应用于insert
,然后将其结果应用于List.fold_left
。
编辑:此外,您无需定义less
。您可以将>
作为函数直接传递,将其括在括号中:insertion_sort (<) ...