我想以两种方式使用函数组合,带括号和不带括号。我试试这个:
let d = (+5)
Prelude> d ( d ( d 2))
17
但如果试试这个:
Prelude> d . d . d 2
<interactive>:12:1: error:
* Non type-variable argument in the constraint: Num (a -> c)
(Use FlexibleContexts to permit this)
为什么会这样?它应该是语义等价的?
d . a x <=> d (a x) ?
不,函数应用程序的优先级高于.
,因此它被解析为d . d . (d 2)
。您需要将函数组合放在括号中,如下所示:(d . d . d) 2
。