函数组合参数在Haskell中的应用

时间:2013-05-02 18:11:44

标签: haskell function-composition pointfree

作为Haskell的新手,我无法理解为什么表达 head . words “one two three four”抛出异常,函数组合head . words必须与$运算符一起应用 - 右侧的表达式不需要进一步评估,因为它只是一个String 。编译它的另一种方法是将head . words放在括号中,但(head . words) :: String -> Stringhead . words :: String -> String具有相同的类型,那么为什么将它放在括号中会使表达式编译?

1 个答案:

答案 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”并且类型适合。