Haskell如果声明条件

时间:2017-02-01 04:00:18

标签: haskell if-statement

这是我第一次进入更多"学术"编程语言。来自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子句

     

失败,模块加载:无。

1 个答案:

答案 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)