Recursion 如何在OCaml中将浮点提升为指数?

Recursion 如何在OCaml中将浮点提升为指数?,recursion,functional-programming,ocaml,Recursion,Functional Programming,Ocaml,我试着写一个函数,它取x,并将它提升到n的幂 如果x和n是整数,则此代码有效: let rec pow x n = if n == 0 then 1 else if (n mod 2 = 0) then pow x (n/2) * pow x (n/2) else x * pow x (n/2) * pow x (n/2);; 如果我尝试将代码更改为在x为浮点时工作,它将崩溃: let rec float_pow x n = if n == 0.0 then 1.0 else if n mod

我试着写一个函数,它取x,并将它提升到n的幂

如果x和n是整数,则此代码有效:

let rec pow x n =
if n == 0 then 1 else
if (n mod 2 = 0) then pow x (n/2) * pow x (n/2) else
x * pow x (n/2) * pow x (n/2);;
如果我尝试将代码更改为在x为浮点时工作,它将崩溃:

let rec float_pow x n =
if n == 0.0 then 1.0 else
if n mod_float 2.0 == 0.0 then float_pow x (n /. 2) *. float_pow x (n /. 2) else
x *. float_pow x (n /. 2) *. float_pow x (n /. 2);;
我得到这个错误:

Error: This expression has type float
   This is not a function; it cannot be applied.

我该怎么办?

我认为关键的问题是,
mod
是OCaml中的一个关键字,被视为中缀运算符。但是,
mod_float
只是一个普通函数。您需要以前缀形式使用它

因此,
xmod n
应转换为
mod\u float xn

您还有一个问题,那就是您正在使用专用的
==
运算符进行相等比较。您希望在OCaml中使用
=
进行相等比较,除非您需要“物理”比较(这不是您想要的)

这不仅仅是风格上的——它真的很重要。注意以下结果:

# 0.0 == 0.0;;
- : bool = false
# 0.0 = 0.0;;
- : bool = true

对于那些只想在OCaml中将值提升为指数的人,相应的操作符在OCaml中被称为
**
,因此
x^n
被编码为
x**n
,例如
2.0**3.14