为什么指数运算符在OCaml中使用浮点变量? 难道它也不允许使用int变量吗?
# 3**3;;
Error: This expression has type int but an expression was expected of type
float
使用:
# 3.0**3.0;;
- : float = 27.
答案 0 :(得分:3)
所以,现有的答案是如何解决这个问题,而不是为什么会这样。主要有两个原因:
1)OCaml没有运算符别名。你不能让两个运营商做同样的事情,而是做不同的类型。这意味着只有一种数字,整数或浮点数(或其他表示形式)才能使用标准的**接口。
2)pow()
,指数函数历来在浮点数上定义(例如,在Standard C中)。
此外,另一种解决问题的方法是,如果您使用的是OCaml电池,则会为整数定义pow函数。
答案 1 :(得分:2)
您可以使用int
let int_exp x y = (float_of_int x) ** (float_of_int y) |> int_of_float
答案 2 :(得分:0)
有一个类似的问题:Integer exponentiation in OCaml
这是一个可能的尾递归整数取幂的实现:
let is_even n =
n mod 2 = 0
(* https://en.wikipedia.org/wiki/Exponentiation_by_squaring *)
let pow base exponent =
if exponent < 0 then invalid_arg "exponent can not be negative" else
let rec aux accumulator base = function
| 0 -> accumulator
| 1 -> base * accumulator
| e when is_even e -> aux accumulator (base * base) (e / 2)
| e -> aux (base * accumulator) (base * base) ((e - 1) / 2) in
aux 1 base exponent