>circumference :: Float –> Float
>circumference r = 2 * pi * r
Загрузите дополненный файл и запустите новую функцию:
>ghci> circumference 4.0
>25.132742
• Тип >Double
– это действительное число с плавающей точкой двойной точности. Двойная точность означает, что для представления чисел используется вдвое больше битов, поэтому дополнительная точность требует большего расхода памяти. Добавим в файл ещё одну функцию:
>circumference' :: Double –> Double
>circumference' r = 2 * pi * r
Загрузите дополненный файл и запустите новую функцию
>ghci> circumference' 4.0
>25.132741228718345
• Тип >Bool
– булевский. Он может принимать только два значения: >True
и >False
.
• Тип >Char
представляет символ Unicode. Его значения записываются в одинарных кавычках. Список символов является строкой.
• Кортежи – это типы, но тип кортежа зависит от его длины и от типа его компонентов. Так что теоретически количество типов кортежей бесконечно – а стало быть, перечислить их все в этой книге нет возможности. Заметьте, что пустой кортеж >()
– это тоже тип, который может содержать единственное значение: >()
.
Некоторые функции могут работать с данными разных типов. Например, функция >head
принимает список и возвращает его первый элемент. При этом неважно, что именно этот список содержит – числа, символы или вообще другие списки. Функция должна работать со списками, что бы они ни содержали.
Как вы думаете, каков тип функции >head
? Проверим, воспользовавшись командой >:t
.
>ghci> :t head
>head :: [a] –> a
Гм-м! Что такое >a
? Тип ли это? Мы уже отмечали, что все типы пишутся с большой буквы, так что это точно не может быть типом. В действительности это типовая переменная. Иначе говоря, >a
может быть любым типом.
Подобные элементы напоминают «дженерики» в других языках – но только в Haskell они гораздо более мощные, так как позволяют нам легко писать самые общие функции (конечно, если эти функции не используют какие-нибудь специальные свойства конкретных типов).
Функции, в объявлении которых встречаются переменные типа, называются полиморфными. Объявление типа функции >head
выше означает, что она принимает список любого типа и возвращает один элемент того же типа.
ПРИМЕЧАНИЕ. Несмотря на то что переменные типа могут иметь имена, состоящие более чем из одной буквы, мы обычно называем их a, b, c, d…
Помните функцию >fst
? Она возвращает первый компонент в паре. Проверим её тип:
>ghci> :t fst
>fst :: (a, b) –> a
Можно заметить, что функция >fst
принимает в качестве параметра кортеж, который состоит из двух компонентов, и возвращает значение того же типа, что и первый компонент пары. Поэтому мы можем применить функцию