为什么函数 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.
的错误
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.