Применение аргументов к композиции функций в Haskell
Будучи новичком в Haskell, я не могу понять, почему выражениеhead . words “one two three four”
выдает исключение и состав функции head . words
должен применяться с $
оператор - выражение справа от него не нуждается в дальнейшей оценке, потому что это просто один String
, Другой способ скомпилировать это поставить head . words
в скобках но (head . words) :: String -> String
имеет тот же тип, что и head . words :: String -> String
так почему в скобках выражение компилируется?
1 ответ
Из-за правил приоритета. Приложение имеет самый высокий приоритет; $
- самый низкий.
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”
и типы подходят.