user1968057
user1968057

Reputation: 59

ocaml function takes function as parameter and output a function

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

Answers (1)

Tikhon Jelvis
Tikhon Jelvis

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

Related Questions