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

ocaml函数将函数作为参数并输出一个函数,ocaml,Ocaml,我需要找到一种方法来组合两个函数并将它们作为一个输出 我有以下代码,其中接收函数列表('a->'a)list,然后使用列表输出函数('a->'a)。向左折叠 我找到了基本情况,但我尝试了很多方法来组合两个函数。输出应具有类型('a->'a)list->('a->'a) 示例输出: # pipe [] 3;; - : int = 3 # pipe [(fun x-> 2*x);(fun x -> x + 3)] 3 ;; - : int = 9 # pipe [(fun x -&g

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

我有以下代码,其中接收函数列表
('a->'a)list
,然后使用
列表输出函数
('a->'a)
。向左折叠

我找到了基本情况,但我尝试了很多方法来组合两个函数。输出应具有类型
('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

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

实际上,有一种组合功能的通用方法:组合。在数学中,这通常写为
f∘ g
其中
f
g
是函数。此操作生成一个新函数,对应于获取一个参数,对其应用
g
,然后对结果应用
f
。所以如果
h=f∘ g
,那么我们也可以把它写成
h(x)=f(g(x))

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

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


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

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

实际上,有一种组合功能的通用方法:组合。在数学中,这通常写为
f∘ g
其中
f
g
是函数。此操作生成一个新函数,对应于获取一个参数,对其应用
g
,然后对结果应用
f
。所以如果
h=f∘ g
,那么我们也可以把它写成
h(x)=f(g(x))

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

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


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

我知道函数是如何调用的,但是我找不到一个先调用acc的函数调用x,有没有一个函数以2函数为参数,输出为函数的例子?啊。我不太明白你的意思。如果您想要获取两个参数并输出一个参数的函数,您可以编写类似于
let compose f g=fun x->…
。这里
f
g
是正常参数;结果是一个函数需要一个参数
x
。这有帮助吗?让f acc x=fun y->x(acc),但是现在函数接受(('a->'a)->'a)列表->'a->'ait现在可以工作了,就像你告诉我定义一个组合函数一样,thx。但是有没有办法不写加法函数?@user1968057您需要问问自己,在您现有的代码中,参数
y
是什么。它的目的是什么?你为什么把它放在那里,而不是放在最后一个位置?为什么有3个参数(
acc
y
x
)?你还需要看看解释中的compose定义,看看里面有多少变量。我知道函数是如何调用的,但是我找不到一个先调用acc的函数调用x,有没有一个函数以2函数为参数,输出为函数的例子?啊。我不太明白你的意思。如果您想要获取两个参数并输出一个参数的函数,您可以编写类似于
let compose f g=fun x->…
。这里
f
g
是正常参数;结果是一个函数需要一个参数
x
。这有帮助吗?让f acc x=fun y->x(acc),但是现在函数接受(('a->'a)->'a)列表->'a->'ait现在可以工作了,就像你告诉我定义一个组合函数一样,thx。但是有没有办法不写加法函数?@user1968057您需要问问自己,在您现有的代码中,参数
y
是什么。它的目的是什么?你为什么把它放在那里,而不是放在最后一个位置?为什么有3个参数(
acc
y
x
)?您还需要查看解释中的compose定义,并查看其中有多少变量。