Function OCaml递归函数应用函数n次

Function OCaml递归函数应用函数n次,function,functional-programming,ocaml,Function,Functional Programming,Ocaml,我想在OCaml中创建一个int->('a->'a)->'a->'a类型的函数,它接受一个int n(非负)、一个函数f'a->'a和一个参数a类型的'a'。f应该被调用n次 我尝试了3种不同的方法,但只能得到int->('a->'b)->'a->'b,以下是我尝试过的一些方法 let rec f n g a = g a; f (n-1) g a;; 给 val f : int -> ('a -> 'b) -> 'a -> 'c = <fun> 这给了我

我想在OCaml中创建一个int->('a->'a)->'a->'a类型的函数,它接受一个int n(非负)、一个函数f'a->'a和一个参数a类型的'a'。f应该被调用n次

我尝试了3种不同的方法,但只能得到int->('a->'b)->'a->'b,以下是我尝试过的一些方法

let rec f n g a = 
g a;
f (n-1) g a;;

val f : int -> ('a -> 'b) -> 'a -> 'c = <fun>
这给了我

val f : int -> ('a -> 'b) -> 'a -> 'b = <fun>
val f:int->('a->'b)->'a->'b=

第二个更接近,但我不知道如何获得int->('a->'a)->'a->'a>'a

一旦正确编写了函数,类型就会变直。第二次尝试的问题是,它为
f5 0…
给出了错误的答案。在我看来,你根本不想在这种情况下应用这个函数

也许下面的例子可以说明我的意思:

# let add1 x = x + 1;;
val add1 : int -> int = <fun>
# f5 2 add1 3;;
- : int = 5
# f5 1 add1 3;;
- : int = 4
# f5 0 add1 3;;
- : int = 3
# 
#让add1 x=x+1;;
val add1:int->int=
#f5 2增补1 3;;
-:int=5
#f5 1增补1 3;;
-:int=4
#f5 0增补1 3;;
-:int=3
# 

在我看来,这些是你应该得到的答案。

我不太确定你想做什么。我猜是下面的函数:

let rec foldi i f acc =
    if i <= 0 then acc else foldi (pred i) f (f acc)
让rec foldi f acc=
如果我
这差不多了,但你必须更多地理解你的问题,也许只是f^n的定义。您可以通过以下方式定义f^n:对于所有x,f^n(x)=f^(n-1)(f(x)),以及f^0(x)=x

在你的代码中,你有f(n-1)ga,这是f^(n-1)(x)和我的符号。你永远不会申请f,只是在最后

解决办法是: f(n-1)g(ga)


每次都必须应用g。

几分钟前我碰巧编写了一个工作版本:

let rec applyn n func arg =
if n <= 0 then
    arg
else
    applyn (n-1) func (func arg)
let rec applyn n func arg=

如果n'a,那么给出'a->'b.

用>=替换>,似乎没有帮助。这是大于/等于的正确运算符还是我的错误在别处?你的错误在别处。你需要一个与论点无关的案例。你的代码中没有这样的例子。(如果你想偷看,你可以在迪迪尔克的答案中看到答案。)再次感谢你的帮助,我承认我确实偷看了。你的代码中pred I到底是什么?它似乎减少了1?
pred
succ
的对偶,它返回其(整数)参数的前导,即该值减去1。是的,您的猜测是正确的。它是在
pervisives
模块中定义的。为这些琐碎的操作定义函数似乎有些奇怪,但由于它们经常出现,它实际上非常方便。哦,我意识到,我对java相当熟悉,我喜欢我的I++;我等等。
let rec f n g a =
if n > 0 then f (n-1) g a
else g a
;;
let rec applyn n func arg =
if n <= 0 then
    arg
else
    applyn (n-1) func (func arg)