【问题标题】:Recursive functions with multiple arguments Haskell具有多个参数的递归函数 Haskell
【发布时间】:2014-04-21 23:10:47
【问题描述】:

一个非常简单的问题:我想在 Haskell 中实现 2 个整数的乘法。 我写的不编译:

mult :: Int -> Int -> Int

mult x 1 = x

mult 1 y = y

mult x y = x + (mult x-1 y)

问题是最后一条语句。我试过把它写成:

mult x y = x + (mult x-1 y)

还有

mult x y = x + (mult(x-1,y))

我得到的错误是:

   Couldn't match expected type `Int' with actual type `Int -> Int'
    In the return type of a call of `mult'

我不知道为什么编译器会说 mult 返回一个 Int -> Int,而它显然返回一个 Int

【问题讨论】:

  • 当您将mult 应用于一个参数时,例如mult 5,您会得到Int -> Int 类型的东西,因为您已将其部分应用于一个参数。很明显,你有mult 5 :: Int -> Int。这与您现在遇到的问题完全无关,但我认为它可能对未来有用,如果不是现在的话。如果现在感到困惑,请忽略它直到以后,不要担心。

标签: haskell recursion multiplication


【解决方案1】:

您必须将x-1 放入括号中!像这样

mult x y = x + (mult (x-1) y)

顺便说一句,这不会计算 x 和 y 的乘积 :-) 尝试一些例子......这只是一个小错误。

【讨论】:

  • 哈哈,是的,刚刚意识到..虽然很容易发现,但确实是愚蠢的错误:)
【解决方案2】:

mult x y = x + (mult x-1 y)

括号内的表达式解析为:

(mult x) - (1 y)

因此编译器认为(-) 的第一个参数是mult x,这是一个Int -> Int 函数,因为只有一个参数(而不是两个)被传递。相反,你想要:

mult x y = x + mult (x-1) y

【讨论】:

    【解决方案3】:

    这是一个简单的解析器问题。当您的意思是mult (x-1) y 时,编译器将mult x-1 y 读取为((-) (mult x) y)。函数应用程序在 Haskell 中的绑定非常紧密,因此有时使用太多括号而不是太少会更好,尤其是在您仍在学习语言基础知识的时候。

    出现错误是因为(mult x)的类型是Int -> Int,而y的类型是Int,不能减去这两项。

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2019-02-28
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多