为什么函数 combine 在 haskell 中需要括号?

why does function combine require parantesis in haskell?

Prelude> -- I have 2 functions: f and g
Prelude> f x y = x + y
Prelude> g x = 2*x
Prelude> f 2 3
5

用 x=2 和 y=3 表达 $ f(x, g(y))* 这个工作很好:

Prelude> f 2 (g 3)
8

为什么会出现以下 return 错误?

Prelude>
Prelude> f 2 g 3

<interactive>:19:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Num a, Num (a -> a)) => a
Prelude> 
f 2 g 3

是(因为函数应用左结合):

f 2 g 3 = ((f 2) g) 3

这就是你得到这个错误的原因 - 它期望 g 有一个 Num(因为它是 f x y = x+y 和 [=16= 中的参数 y ])

2 作为文字可以是每个 Num a 中的值,但 GHC 不知道 Num 的实例是函数 a -> a.

现在错误本身是关于上下文的——基本 Haskell 不能有 Num ((->) a a) 形式的约束——但是你可以很容易地(安全地)用给定的扩展来绕过这个......那么你应该得到类型为-class.

的错误