OCaml递归函数应用函数n次

时间:2013-03-08 01:54:39

标签: function functional-programming ocaml

我想创建一个int类型的函数 - > ('a - >'a) - > 'a - >在OCaml中的a,其采用int n(非neg)和函数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>

我试过

    let rec f n g a =
  if n > 0 then f (n-1) g a
  else g a
  ;;

给了我

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

第二个更接近,但我对如何获得int感到茫然 - &gt; ('a - &gt;'a) - &gt; 'a - &gt; “一

4 个答案:

答案 0 :(得分:5)

我不太确定你要做什么。我想这是下面的功能:

let rec foldi i f acc =
    if i <= 0 then acc else foldi (pred i) f (f acc)

将函数i递归f次递归到值acc,然后递归到其结果。 foldi可能不是它的最佳名称。

答案 1 :(得分:2)

一旦正确编写了函数,该类型将变直。第二次尝试的问题在于它为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
# 

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

答案 2 :(得分:2)

let rec f n g a =
if n > 0 then f (n-1) g a
else g a
;;

这几乎就是这样,但你必须更多地了解你的问题,也许只是f ^ n的定义。你可以定义f ^ n:对于所有x,f ^ n(x)= f ^(n-1)(f(x)),和f ^ 0(x)= x

在你的代码中,你有f(n-1)g a,这是带有我的符号的f ^(n-1)(x)。你永远不会在最后使用f。

解决方案是: f(n-1)g(g a)!!!

你必须每次都申请g。

答案 3 :(得分:1)

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

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

请注意,每次进行递归调用时都会发生函数应用程序。在你的代码中,g只被调用一次; OCaml不能推断它是'a - &gt; 'a,所以给'a - &gt; “B