Haskell处理负参数

时间:2013-11-27 23:29:45

标签: haskell

尝试将两个值相加,其中只有一个为负值,例如-12

soma :: Float -> Float -> Float
soma x1 x2 = x1 + x2

导致错误;为什么?

<interactive>:10:6:
No instance for (Num (Float -> Float -> Float))
  arising from a use of `-'
Possible fix:
  add an instance declaration for (Num (Float -> Float -> Float))
In the expression: soma - 1 2
In an equation for `it': it = soma - 1 2

1 个答案:

答案 0 :(得分:8)

您应该使用(-1)而不是 - 1.解析器将您键入的内容解释为( - )soma(1 2)。换句话说,它试图从soma中减去(1 2)。哪个不起作用,因为减法不接受Float - &gt;浮动 - &gt;浮。

你想要(并且预期会发生)是为了让haskell评估 - 作为1上的一元运算符,优先级高于函数应用程序。这与haskell正常工作的方式相反。已经特别考虑(-1)被解释为(否定1)。 This can cause some problems,由于是一个特例 - 在试图讨论的例子中 - 不起作用,因为它不是真的 - 但是否定。

据推测,一个更广泛的特殊案例可能会让经验丰富的haskell程序员更加出乎意料,因此语言设计师认为它不值得。