2012-09-22 50 views
2

下面的代码产生一个错误:无法与实际Int类型匹配期望的类型INT - >内部在Haskell

power:: Int -> Int -> Int 
power a b 
     | a ==0 || b == 0  = 0 
     | otherwise = power ((multiply a a) (b-1)) 

multiply:: Int -> Int -> Int 
multiply a b 
     | a <= 0  = 0 
     | otherwise  = (multiply (a-1) (b)) + b 

返回的错误是

power.hs:6:25: 
    Couldn't match expected type `Int' with actual type `Int -> Int' 
    In the return type of a call of `power' 
    Probable cause: `power' is applied to too few arguments 
    In the expression: power (multiply (a a) b - 1) 
    In an equation for `power': 
     power a b 
      | b == 0 = 0 
      | otherwise = power (multiply (a a) b - 1) 
+1

该错误不匹配的代码。这是无礼的! –

+0

如果你代表数学的权力和乘法,你需要改变你的定义。此刻,功率2 0 == 0,而2^0 = 1。事实上,正因为如此,功率将只会是0.对于其他数字,每次功率平方,所以一旦你解决了0问题,你将得到功率x y x ^(2^y)。你需要跟踪起始数字y来阻止它。 – AndrewC

回答

3

的错误是在表达power ((multiply a a) (b-1))。问题在于额外的一对括号。您实际上只将一个参数传递给power,即((multiply a a) (b-1))。这个表达式本身是无效的,因为(multiply a a)的结果是Int,它不能接受参数。

您应该重写此为

| otherwise = power (multiply a a) (b-1) 
+0

谢谢 - 我试着简单地编译:“power(multiply(aa)(b-1)”,以及“power aa b-1”和“power multiply aa(b-1)”,并且所有括号可能性列出,它仍然解析的权力只有一个整数的参数为​​什么会这样呢? – user1690181

+2

@ user1690181:这些都不符合我给你的表达式。你只是添加和删除语法,并希望它的工作?只需使用我已输入的内容即可。 –

+0

现在运行良好!谢谢:-) – user1690181

相关问题