作为Haskell的新手,我无法理解为什么表达
head . words “one two three four”
抛出异常,函数组合head . words
必须与$
运算符一起应用 - 右侧的表达式不需要进一步评估,因为它只是一个String
。编译它的另一种方法是将head . words
放在括号中,但(head . words) :: String -> String
与head . words :: String -> String
具有相同的类型,那么为什么将它放在括号中会使表达式编译?
答案 0 :(得分:11)
由于优先规则。应用程序具有最高优先级; $
- 最低。
head . words “one two three four”
被解析为head . (words “one two three four”)
,即应用于字符串的words
必须生成一个函数(如(.)
所要求的那样)。但那不是words
所具有的类型:
Prelude> :t words
words :: String -> [String]
另一方面, head . words $ “one two three four”
被解析为(head . words) “one two three four”
并且类型适合。