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定义,并查看其中有多少变量。