使用fold将函数列表组合到单个函数中

时间:2018-06-14 01:10:08

标签: functional-programming ocaml fold

假设我有一个功能列表

let plus_one (x: int) : int = x + 1 in
let double (x: int) : int = x * 2 in
let square (x: int) : int = x * x in
let fun_list = [square, double, plus_one] ;;

使用fold,我想获取这个函数列表并将它们组合成一个函数。像,

let combined (x: int) : int = x * (2 * (x + 1))

这就是我所拥有的:

let combine_functions (fun_list : ('a -> 'a) list) : ('a -> 'a) =
    List.fold_right (fun f acc -> f acc) fun_list (fun x -> x)
;;

我认为这会有效,但是当我尝试运行它时,它会告诉我这个表达式有类型' a - > ' a何时应该有类型(' a - >' a) - > (' a - >' a)

2 个答案:

答案 0 :(得分:1)

我通过更改

中的第二行代码解决了这个问题
List.fold_right (fun f acc -> f acc) fun_list (fun x -> x)

List.fold_right (fun f acc -> (fun x -> f (acc x))) fun_list (fun x -> x)

答案 1 :(得分:0)

我有点不清楚你想要什么样的组合,你的意思是enter image description here如果是这样,那么你的组合函数看起来像这样:

square (double (plus_one x))

((x + 1) * 2) * ((x + 1) * 2)

可以通过函数

实现
let combine_functions ls =
  List.fold_right (fun f x -> f x) ls;;

然而,我并不完全确定这是否真的是你想要做的。顺便说一句,你不需要明确地键入你所有的OCaml代码,而且我个人发现当我让类型推断为我做的时候我会更有效率。