1

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

我有以下代码,其中接受函数列表,('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
4

1 回答 1

1

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

在实践中,有一种组合功能的通用方式:组合。在数学中,这通常被写为f ∘ gwherefgare 函数。这个操作产生一个新函数,对应于接受一个参数,应用g到它,然后应用f到结果。所以如果h = f ∘ g, 那么我们也可以把它写成h(x) = f(g(x))

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

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

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

于 2013-01-29T09:19:04.947 回答