Одна из базовых единиц любого языка программирования — символ. Символом традиционно называется последовательность букв, цифр и специальных знаков ограниченной или неограниченной длины. В некоторых языках строчные и прописные буквы различаются, в некоторых нет. Так в Lisp’е различия между строчными и заглавными буквами нет, а в Haskell’е есть.
Символы чаще всего выступают в качестве идентификаторов — имен констант, переменных, функций. Значениями же констант, переменных и функций являются типизированные последовательности знаков. Так значением числовой константы не может быть строка из букв и т.п. В функциональных языках существует базовое понятие — атом. В реализациях атомами называются символы и числа, причем числа могут быть трех видов: целые, с фиксированной и с плавающей точкой.
Следующим понятием функционального программирования является список. В абстрактной математической нотации использовались символы [], которые также используются в Haskell’е. Но в Lisp’е используются обычные "круглые" скобки — (). Элементы списка в Lisp’е разделяются пробелами, что не очень наглядно, поэтому в Haskell’е было решено ввести запятую для разделения. Таким образом, список [a, b, c] будет правильно записан в синтаксисе Haskell’а, а в нотацию Lisp’а его необходимо перевести как (a b c). Однако создатели Lisp’а пошли еще дальше в своей изощрённости. Допускается использовать точечную запись для организации пары, поэтому приведенный выше список можно записать как (a.(b.(c.NIL))).
Списочные структуры в Lisp’е и Haskell’е описываются в соответствии с нотацией — заключение одного списка в другой. При этом в нотации Lisp’а сделано послабление, т.к. перед скобкой внутреннего списка можно не ставить пробел.
Как говорилось во вводной лекции, типы данных в функциональных языках определяются автоматически. Механизм автоматического определения типа встроен и в Haskell. Однако в некоторых случаях необходимо явно указывать тип, иначе интерпретатор может запутаться в неоднозначности (в большинстве случаев будет выведено сообщение об ошибке или предупреждение). В Haskell’е используется специальный символ — :: (два двоеточия), который читается как "имеет тип". Т.е. если написать:
5 :: Integer
Это будет читаться: "Числовая константа 5 имеет тип Integer (Целое число)".
Однако Haskell поддерживает такую незаурядную вещь, как полиморфные типы, или шаблоны типов. Если, например, записать [a], то это будет обозначать тип "список из атомов любого типа", причем тип атомов должен быть одинаковым на протяжении всего списка. Т.е. списки [1, 2, 3] и [‘a’, ‘b’, ‘c’] будут иметь тип [a], а список [1, ‘a’] будет другого типа. В этом случае в записи [a] символ a имеет значение типовой переменной.