Haskell的GCF与elses

时间:2016-10-19 18:52:11

标签: haskell functional-programming

刚刚开始做Haskell,我被赋予了执行类似于计算阶乘的基本GCF功能的任务。 这就是我想出来的

ggt :: Integer -> Integer -> Integer
ggt m n = if m < n then ggt n m
          else if n==0 then m
          else ggt n (m mod n)

我看到了回应here,然而,这与我到目前为止所展示的方式完全不同(我认为它被称为保护模式)。我的问题是我的代码不会加载,它说

 * Couldn't match expected type `(Integer -> Integer -> Integer)
                                    -> Integer -> Integer'
                  with actual type `Integer'
    * The function `m' is applied to two arguments,
      but its type `Integer' has none
      In the second argument of `ggt', namely `(m mod n)'
      In the expression: ggt n (m mod n)
Failed, modules loaded: none.

我不明白为什么类型不匹配(我有三个整数,两个作为输入,m和n,一个作为返回),作为一个新手,我不知道第二个错误的确意味着。

我会感谢所有帮助以及各种解释!

干杯!

1 个答案:

答案 0 :(得分:1)

非操作符函数名称必须用反引号括起来,以便在中缀位置使用。也就是说,

ggt :: Integer -> Integer -> Integer
ggt m n = if m < n then ggt n m
          else if n==0 then m 
          else ggt n (m `mod` n)

否则,m被视为函数的名称,该函数将mod函数作为其第一个参数,n作为其第二个参数。这样的函数将具有类型(Integer -> Integer -> Integer) -> Integer -> Integer,但m :: Integer,因此错误消息。

一种更清晰的方式来定义这个(嵌套的if表达不是最容易阅读的)将涉及一个简单的警卫。

ggt :: Integer -> Integer -> Integer
ggt m n | m < n = ggt n m
ggt m 0 = m
ggt m n = ggt n (m `mod` n)

或使用更多参与的守卫而不是3个单独的模式匹配:

ggt :: Integer -> Integer -> Integer
ggt m n | m < n     = ggt n m
        | n == 0    = m
        | otherwise = ggt n (m `mod` n)