我有以下练习:
Code a function that will be a summation of a list of functions.
所以我认为这意味着如果一个函数得到函数列表[f(x); g(x); h(x); ...],它必须返回一个函数f(x)+ g( X)+ H(X)+ ...
我正在尝试为一般情况做代码,这是我提出的事情:
let f_sum (h::t) = fold_left (fun a h -> (fun x -> (h x) + (a x))) h t;;
问题是我正在使用“+”运算符,这意味着它只在列表中有效时才能使用
类型的函数'a -> int
那么,它可以更“普遍”地完成吗,我的意思是我们可以编写一个函数,即列表中给出的('a - >'b)函数的总和吗?
答案 0 :(得分:1)
是的,您可以将plus函数作为函数的参数,例如
let f_sum plus fs =
let (+) = plus in
match fs with
| [] -> invalid_arg "f_sum: empty list"
| f :: fs -> fold_left ...
您可以进一步概括,并要求用户提供zero
值,以便您可以返回一个函数,如果列表为空则返回零。您还可以使用记录对函数进行分组,甚至可以使用第一类模块(参见核心库中的Commutative_group.S
)。