【问题标题】:Couldn't match expected type Int with actual type Int -> Int in Haskell无法将预期类型 Int 与 Haskell 中的实际类型 Int -> Int 匹配
【发布时间】:2012-09-14 10:35:43
【问题描述】:

以下代码产生错误:

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)

【问题讨论】:

  • 该错误与该代码不匹配。太不礼貌了!
  • 如果您要代表数学乘方和乘法,则需要更改定义。目前,幂 2 0 == 0,而 2^0=1。事实上,正因为如此,幂永远只会是 0。对于其他数字,每次都是幂平方,所以一旦你解决了 0 的问题,你就会得到幂 x y 计算 x^(2^y)。您需要跟踪起始数字 y 才能停止此操作。

标签: haskell


【解决方案1】:

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

你应该把它改写为

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

【讨论】:

  • 谢谢 - 我尝试再次编译:“power (multiply(aa) (b-1)”以及“power multiply aa b-1”和“power multiply aa (b- 1)" 并且列出了所有括号的可能性,它仍然将参数解析为一个整数。为什么会这样?
  • @user1690181:这些都不符合我给你的表达方式。您是否只是随意添加和删除语法并希望它有效?只需使用我已经输入的内容。
  • 现在运行良好!谢谢:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2012-08-29
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多