首页 > 解决方案 > 使用 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] ;;

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

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 -> '一个)

标签: functional-programmingocamlfold

解决方案


我已经通过更改第二行代码解决了这个问题

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)

推荐阅读