Применение аргументов к композиции функций в 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” и типы подходят.

Другие вопросы по тегам