На этом шаге мы рассмотрим особенности описания типа функции.
В функциональном языке используется статическая проверка типов, т.е. любое значение, любое выражение, любая функция должны иметь определённый тип до начала процесса выполнения.
Таким образом, функции "ожидают" на вход только аргументы, тип которых соответствует описанному в определении функции типу аргументов, иначе на этапе выполнения программы возникнет ошибка, которая называется ошибкой несоответствия типов.
Для указания типа в синтаксисе языка имеется специальный символ
"::" (читается: "имеет тип").
Описание типа функции выглядит так же, как и в математической нотации, за исключением того, что символ "→" кодируется лексемой "->", которая обозначает операцию аппликации для типа функции.
Операция аппликации для типа функции является правоассоциативной операцией.
(1) someFn:: Int -> Int -> Double (2) someFn:: Int -> (Int -> Double) (3) someFn:: (->) Int ((->) Int Double)
Переменные типов приобретают значения в зависимости от типов данных, поступающих на вход функции; они детерминированы и не могут иметь разные значения в разных местах записи функции.
f:: b -> b -> Bool
Если на вход функции f поступят два целых числа, то переменная типов b получит значение Integer; если на вход поступят два вещественных числа, то переменная типов b получит значение Double.
На следующем шаге мы рассмотрим постоянные функции.