为什么函数组合需要括号?

10
假设我想用Text.strip组合Text.pack。
:t (.) 产生:(b -> c) -> (a -> b) -> a -> c
:t (Text.pack) 产生:String -> Text
:t (Text.strip) 产生:Text -> Text
因此,将strip替换为(b -> c)给出: b = Text c = Text
将pack替换为(a -> b)给出: a = String b = Text
让我们验证::t strip . pack 产生: strip . pack :: String -> Text
好的,让我们试试它:
strip.pack " example "
产生:
Couldn't match expected type ‘a -> Text’ with actual type ‘Text’
Relevant bindings include
  it :: a -> Text (bound at <interactive>:31:1)
Possible cause: ‘pack’ is applied to too many arguments
In the second argument of ‘(.)’, namely ‘pack "    example     "’
In the expression: strip . pack "    example     "
(strip . pack) " example " 的效果符合预期....为什么呢?
2个回答

13

函数应用的优先级高于组合。

strip.pack " example " 相当于 strip.(pack " example ")。这是人们使用 $ 来“抑制”应用程序直到所有函数都被组合的原因之一:

strip . pack $ "    example     "

8
更强大的是,函数应用比任何其他东西的优先级都要高。 - amalloy
这种优先级允许例如 filter even . map (+5)。部分应用函数的组合相当惯用。还要注意,map、filter 等的参数顺序是为了方便选择的。 - chi

2

函数应用优先级高于函数组合操作符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接