- •1. Поколения языков программирования.
- •2.Понятие фп, история развития.
- •1 . Трактовка функции через понятие переменная
- •2. Определения без переменных:
- •3.Программирование при помощи функций.
- •4. Программирование при помощи процедур.
- •5. Символьные данные в строго-функциональных языках.
- •6.Элементарные селекторы, конструкторы и предикаты.
- •7. Рекурсивные функции.
- •8. Проблема выбора подфункции
- •9. Накапливающий параметр — аккумулятор
- •10. Локальное определение.
- •11. Функции высших порядков.
- •12. Фвп применительно к языку Haskell.
- •13. Основы лямбда исчисления
- •14. Правило преобразования лямбда выражения.
- •15. Ромбическое свойство системы редукций.
- •16. Стандартные порядки редукций.
- •18. Структуры данных и их типы на языке Haskell.
- •1. Синонимы типов
- •19. Понятие модуля в Haskell.
- •Абстрактные типы данных
- •Другие аспекты использования модулей
- •20. Классы и их экземпляры в Haskell.
- •21. Наследование в языке Haskell.
- •22. Сорта типов и структуры данных.
- •[Править]Определение
- •[Править]Примеры
18. Структуры данных и их типы на языке Haskell.
Четыре базовых типа - это, конечно, типы, определяющие наборы хорошо известных значений целого, вещественного, логического и символьного типов. Отметим несколько особенностей базовых типов Haskell, непривычных по другим языкам программирования.
Тип Integer определяет потенциально бесконечный набор целых чисел произвольной длины. В операциях над целыми типа Integer никогда не происходит «переполнения» (конечно, в пределах выделенной для работы программы памяти). Для повышения эффективности работы программ можно использовать и вполне традиционные целые ограниченной длины. Для таких «ограниченных» целых используется идентификатор типа Int. Последовательность цифр, возможно, предваренная знаком '–', представляет в программе целое число (как говорят, целые числа имеют литеральные обозначения в виде
последовательности цифр).
Вещественные числа типов Float и Double определяются вполне традиционно и имеют также традиционные литеральные обозначения, такие как 3.14, -2.71828 или 0.12е-10.
Символьный тип также имеет литеральные обозначения для своих значений, и они тоже вполне традиционны. Так, обозначение 'а' представляет символ а.
Логический тип представлен двумя значениями – истина и ложь.
Литеральных обозначений для логических значений в языке нет, однако, имеются два стандартных идентификатора – True и False, обозначающие истинное и ложное значения соответственно.
Кроме типа списков, которые могут содержать элементы одного типа, в языке haskell существует другой сложный тип данных – кортежи(tuples).
Кортеж содержит фиксированный набор элементов разных типов.
Элеметы заключаются в круглые скобки и разделяются запятыми.
Примеры:
(10, 'a' )
(10, (14, 'a','b') )
Стратегии создания типов.
1. Синонимы типов
С помощью конструкции введения синонима для типа можно определить новый идентификатор для уже имеющегося типа. Эта конструкция начинается словом type.
(При этом мы не вводим новый тип, мы лишь определяем для него псевдоним.) Например, если мы хотим определить идентификатор Pair для обозначения пары (кортежа) из двух вещественных чисел, то в программе следует ввести следующее описание:
type Pair = (Double, Double)
String является синонимом для списка значений типа Char. Тип Char представляет символы. Итак строка – это список символов. В Haskell символы пишутся в ординарных кавычках, а строки в двойных: type String = [Char]
2. С помощью другой конструкции языка – data – можно определить не только новый идентификатор типа, но и новые объекты, которые и будут значениями этого типа. Для этого помимо нового идентификатора в определении data описывают конструкторы объектов, с помощью которых можно создавать новые объекты описываемого типа. В
простейшем случае определение нового типа будет просто состоять из перечисления всех конструкторов, разделенных вертикальной чертой.
data Maybe a = Nothing
| Just a
head :: [a] -> Maybe
head [ ] = Nothing
head (x:xs) = Just x
Здесь указано, что Maybe — это конструктор типа, в который помещается определенный тип a, чтобы получить (конкретный) тип данных. Еще говорят, что Maybe — это «полиморфный» тип данных, смысл тот же.
Значение типа Maybe a может либо быть, либо отсутствовать. Если значение равно Nothing («Ничто»), то его «как бы и нет», а если оно равно Just x для некоторого значения x, то это «просто» значение x. Можно думать об этом как о контейнере, в котором либо 0 элементов, либо он один.
Рекурсивные типы (бинарные деревья)
data Tree a = Leaf a | Branch (Tree a) (Tree a)
Здесь мы определяем полиморфный тип бинарного дерева, элементами которого являются либо узлы-листья, содержащие значения типа a, либо внутренние узлы («ветви»), содержащие (рекурсивно) два поддерева.
Бесконечные типы данных (список)
data List a = Nil | Cons a (List a)
В этом определении типа списка идентификатор List – это идентификатор нового типа, а в качестве имен конструкторов пустого и непустого списков как и в предыдущем определении используются идентификаторы Nil и Cons.
Перечислимые типы:
data Color = Red | Black | Blue | Green | Yellow | Custom Int Int Int
data Bool = True | False
