这是我第一次进入更多"学术"编程语言。来自Java / C的土地,我在Haskell中遇到了一些与If语句相关的问题。似乎所有示例都使用单个参数,并使用简单的gt,ls或eq进行比较。
我尝试做的是检查函数的参数是偶数还是奇数,然后根据该结果返回一个值。这是为了加快指数的计算,如下:
n ^ k =(n ^(k / 2))^ 2,如果k是偶数
n ^ k = n * n ^(k-1)如果k是奇数
这是我到目前为止所拥有的:
fastExp1 :: Integer -> Integer
fastExp1 x y =
if y `mod` 2 = 1
then x * x^(y-1)
else if y `mod` 2 = 0
then (x^(y/2))^2
else 0
我试图使用守卫方程来构建它,但我似乎无法理解如何构建它:
fastExp2 :: Integer -> Integer
fastExp2 x y | (x `mod` 1) = 0 = (x^(y/2))^2
| (x `mod` 1) = 1 = x * x^(y-1)
| otherwise = 0
在Java中,这不是任何问题:
public static int fastExp1 (int x, int y) {
if (y%2 == 0) {
// The exponent was even.
return (int) Math.pow((Math.pow(x,(y/2))), 2);
} else if (y%2 == 1) {
// The exponent was odd.
return (int) Math.pow((x*x), (y-1));
} else {
return 0;
}
}
我可以确认Java代码是按预期工作的,但是我得到了Haskell:
C:\ hello.hs:16:5:
在if语句中解析错误:缺少required和else子句
失败,模块加载:无。
答案 0 :(得分:2)
正如评论中指出的那样(chepner& Ben),Haskell使用==
进行比较,其中=
用于定义。
对于未来的读者,这里是完整的代码:
fastExp1 :: Integer -> Integer -> Integer
fastExp1 x y =
if y `mod` 2 == 1
then x * x^(y-1)
else if y `mod` 2 == 0
then (x^(y `div` 2))^2
else 0
fastExp2 :: Integer -> Integer -> Integer
fastExp2 x y | (y `mod` 2 == 0) = (x^(y `div` 2))^2
| (y `mod` 2 == 1) = x * x^(y-1)
| otherwise = 0
根据 leftaroundabout 的建议,fastExp2也可以通过以下方式完成:
fastExp2 x y | (y',0) <- y`divMod`2 = (x^y')^2
| otherwise = x * x^(y-1)