我需要找到一种方法来组合两个函数并将它们作为一个输出。
我有以下代码,其中包含函数('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
答案 0 :(得分:1)
既然你知道你必须使用左折叠,你现在必须解决一个相当受约束的问题:给定两个类型'a -> 'a
的函数,你如何将它们组合成一个相同类型的单个函数?
在实践中,有一种结合功能的一般方法:组合。在数学中,这通常写为f ∘ g
,其中f
和g
是函数。此操作会生成一个新函数,该函数对应于参数,对其应用g
,然后将f
应用于结果。因此,如果h = f ∘ g
,我们也可以将其写为h(x) = f(g(x))
。
所以你的函数f
实际上是函数组合。 (你应该给它一个比f
更好的名字。)它必须接受两个'a -> 'a
类型的函数,并产生另一个相同类型的函数。这意味着它生成一个参数的函数,您可以在其中生成一个带有两个参数的函数。
因此,您需要编写compose
类型的函数f
(比('a -> 'a) -> ('a -> 'a) -> ('a -> 'a)
更易读的名称)。它必须采用两个参数f
和g
并生成一个函数,将它们都应用于它的参数。
我希望这能澄清你需要做什么。弄清楚在OCaml中如何做到这一点是一项健康的运动。