关于Haskell函数组合运算符的另一个麻烦

时间:2018-04-05 09:00:33

标签: haskell

import PhoneNumberKit

let phoneNumberKit = PhoneNumberKit()

do {
    let phoneNumber = try phoneNumberKit.parse(yourNumberString)
    let national = phoneNumber.nationalNumber // that's what you ask for
}
catch let error {
    // handle error
}

嗨,我是Some errors and difficulties with Haskell function composition的提问者,现在又遇到了麻烦。为什么这个简单的代码无效? 这是不工作的代码列表:

*Main> (negate.abs) -7

<interactive>:26:1: error:
? Non type-variable argument in the constraint: Num (c -> c)
  (Use FlexibleContexts to permit this)
? When checking the inferred type
    it :: forall c. (Num (c -> c), Num c) => c -> c

上面有相同的错误消息。我无法弄清楚,所以我能得到一些帮助,说明它为什么不起作用,我该如何解决?而且我也想了解错误信息的含义,以及为什么只有最后一个工作。谢谢。

1 个答案:

答案 0 :(得分:9)

如果我们看一下表达式:

(negate.abs) -7

我们实际上看到了一个减法。确实:我们从7中减去(negate . abs),所以对于Haskell,它看起来像你写的:

(negate.abs) - (7)

现在,如果你执行减法,两个操作数都需要是Num(并且两个参数需要具有相同的类型,但这里不相关),因为(-)具有类型{ {3}}

其他表达式面临同样的问题(当然,虽然有不同的细节)。

解决问题的方法是让Haskell明白-一元减去与7相关的,我们可以通过使用括号来做到这一点:

(negate.abs) (-7)

但我们也可以通过其他方式隔离它,例如使用let语句:

let minusseven = -7 in (negate.abs) minusseven