Ocaml N次函数合成

Ocaml N次函数合成,ocaml,Ocaml,我需要编写一个代码来组成一个函数f(x),它本身使用递归函数N次 我写的是: let f x = x + 1 (*it can be any function*) let rec compose n f x = if n = 0 then "Can't compose anymore" else compose (n-1) f (f x);; 这显然是不对的。我知道代码还没有完成,但我不知道如何继续。我走对了吗?你能告诉我怎么解决这个问题吗?你走的路是对的。根据

我需要编写一个代码来组成一个函数f(x),它本身使用递归函数N次

我写的是:

let f x = x + 1 (*it can be any function*)
let rec compose n f x = if n = 0 then 
   "Can't compose anymore" 
else compose (n-1) f (f x);; 

这显然是不对的。我知道代码还没有完成,但我不知道如何继续。我走对了吗?你能告诉我怎么解决这个问题吗?

你走的路是对的。根据要求,我将尝试从以下等式开始:

compunere 1 f x == f x
如上所述,将
f
应用于
x
一次与执行
(f x)
完全相同

同样,应用
f
两次应该计算
f(fx)
。如果您通过调用
计算机
来替换
(f x)
,则您有:

compunere 2 f x == f (f x) = f (compunere 1 f x)
递归的一般模式似乎是:

compunere n f x == f (compunere (n - 1) f x)
请注意,
f
的最一般类型是
a->b
,但是当使用类型
b
的值再次调用
f
时,这意味着
a
b
应该是相同的类型,因此
f
实际上是一个自同态,一个
a->/code>类型的函数。这是N>=1的情况,但在N=0的退化情况下,可能会有不同的行为

f
零时间应用于
x
可能意味着“返回x”,这意味着
computere
理论上可以为零返回
a
类型的值,因为任何
f
都是
a->b
函数,
a
b
可能不同;您可以用更多的代码来区分这两种情况,但这里我们可以简单地让typechecker在所有情况下强制执行
a=b
的约束,并具有统一的行为。您还可以通过抛出异常使0无效(如负数)(从理论上讲,负数应用程序可能是反函数的正向应用程序,但当您对f一无所知时,您无法计算该值;f可能是不可逆的)

您的代码有点不同:

compunere 3 f x == (compunere 2 f (f x))
                == (compunere 1 f (f (f x)))
                == (compunere 0 f (f (f (f x))))
...
这种方法的优点是,对
computere
的递归调用直接给出当前计算的结果:它位于尾部位置,允许编译器执行尾部调用消除


当达到N=0时,本地绑定的值
x
将给出所需的结果。这里,对于N=0作为输入,唯一自然的解释也是返回
x

是否缺少代码?
let的表达式。。。。。在
中定义要在下一行中使用的变量。但最后一行在
中以
结尾。您应该使用OCaml顶层来至少确认您的语法是正确的。这可能就是你被否决的原因。没有代码缺失。我只是不知道如何继续,所以我写下了我到目前为止写的东西。
compunere 2 f x == f (f x)