刚刚开始做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,一个作为返回),作为一个新手,我不知道第二个错误的确意味着。
我会感谢所有帮助以及各种解释!
干杯!
答案 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)