ocaml函数将函数作为参数并输出函数

时间:2013-01-29 08:59:13

标签: ocaml

我需要找到一种方法来组合两个函数并将它们作为一个输出。

我有以下代码,其中包含函数('a->'a) list的列表,然后使用('a->'a)输出函数List.fold_left

我想出了基本情况,但我尝试了很多方法来组合两个函数。输出应具有类型('a -> 'a) list -> ('a -> 'a)

示例输出:

# 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

功能:

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

1 个答案:

答案 0 :(得分:1)

既然你知道你必须使用左折叠,你现在必须解决一个相当受约束的问题:给定两个类型'a -> 'a的函数,你如何将它们组合成一个相同类型的单个函数?

在实践中,有一种结合功能的一般方法:组合。在数学中,这通常写为f ∘ g,其中fg是函数。此操作会生成一个新函数,该函数对应于参数,对其应用g,然后将f应用于结果。因此,如果h = f ∘ g,我们也可以将其写为h(x) = f(g(x))

所以你的函数f实际上是函数组合。 (你应该给它一个比f更好的名字。)它必须接受两个'a -> 'a类型的函数,并产生另一个相同类型的函数。这意味着它生成一个参数的函数,您可以在其中生成一个带有两个参数的函数。

因此,您需要编写compose类型的函数f(比('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)更易读的名称)。它必须采用两个参数fg并生成一个函数,将它们都应用于它的参数。

我希望这能澄清你需要做什么。弄清楚在OCaml中如何做到这一点是一项健康的运动。