Reputation: 59
I need to find a way to combine two functions and output them as one.
I have the following code where take in a list of function ('a->'a) list
then output a function ('a->'a)
using the List.fold_left
.
I figured out the base case, but I tried a lot of ways to combine two functions. The output should have the type ('a -> 'a) list -> ('a -> 'a)
.
example output:
# pipe [] 3;;
- : int = 3
# pipe [(fun x-> 2*x);(fun x -> x + 3)] 3 ;;
- : int = 9
# pipe [(fun x -> x + 3);(fun x-> 2*x)] 3;;
- : int = 12
function:
let p l =
let f acc x = fun y-> fun x->acc in (* acc & x are functions 'a->'a *)
let base = fun x->x in
List.fold_left f base l
Upvotes: 1
Views: 3212
Reputation: 68172
Since you know that you have to use a left fold, you now have to solve a fairly constrained problem: given two functions of type 'a -> 'a
, how do you combine them into a single function of the same type?
In practice, there is one general way of combining functions: composition. In math, this is usually written as f ∘ g
where f
and g
are the functions. This operation produces a new function which corresponds to taking an argument, applying g
to it and then applying f
to the result. So if h = f ∘ g
, then we can also write this as h(x) = f(g(x))
.
So your function f
is actually function composition. (You should really give it a better name than f
.) It has to take in two functions of type 'a -> 'a
and produce another function of the same type. This means it produces a function of one argument where you produce a function taking two arguments.
So you need to write a function compose
(a more readable name than f
) of type ('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)
. It has to take two arguments f
and g
and produce a function that applies both of them to its argument.
I hope this clarifies what you need to do. Figuring out exactly how to do it in OCaml is a healthy exercise.
Upvotes: 1