我正在阅读 Haskell Prelude 并发现它很容易理解,然后我偶然发现了指数定义:
(^) :: (Num a, Integral b) => a -> b -> a
x ^ 0 = 1
x ^ n | n > 0 = f x (n-1) x
where f _ 0 y = y
f x n y = g x n where
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
_ ^ _ = error "Prelude.^: negative exponent"
我不明白需要两个嵌套where
的 s。
到目前为止我所理解的:
(^) :: (Num a, Integral b) => a -> b -> a
底数必须是数字和指数整数,好的。
x ^ 0 = 1
基本情况,简单。
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
平方指数……有点……为什么f
需要助手?为什么f
和g
给定单字母名称?它只是优化,我是否遗漏了一些明显的东西?
_ ^ _ = error "Prelude.^: negative exponent"
N > 0 之前检查过,如果我们到达这里,N 是负数,所以错误。
我的实现将直接转换为以下代码:
Function exp-by-squaring(x, n )
if n < 0 then return exp-by-squaring(1 / x, - n );
else if n = 0 then return 1; else if n = 1 then return x ;
else if n is even then return exp-by-squaring(x * x, n / 2);
else if n is odd then return x * exp-by-squaring(x * x, (n - 1) / 2).
来自维基百科的伪代码。