Сравнение функциональных языков
Оригинал: Comparison of functional programming languages
Язык | P | LE | T | ADT | AT | ID | TC | F | M | C |
Lisp | ✗ | ✓ | D | ✓ | ? | ✗ | ? | ✓ | ✓ | ✓ |
Scheme | ✗ | ✗ | D | ✓ | ✗ | ✗ | ? | ? | ✓ | ✓ |
Clojure | ✗ | ✓ | D | ✓ | ✓ | ✓ | ? | ✓ | ✓ | ? |
ML | ✗ | ✗ | S | ? | ? | ✓ | ? | ✓ | ✓ | ? |
F# | ✗ | ✓ | S | ? | ✓ | ✓ | ? | ? | ✓ | ✓ |
Haskell | ✓ | ✓ | S | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Frege | ✓ | ✓ | S | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Scala | ✗ | ✓ | S | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
JavaScript | ✗ | ✓ | D | ✓ | ✓ | P | ? | ✓ | ✓ | ✓ |
Miranda | ✓ | ✓ | S | ✓ | ✓ | ? | ? | ? | ? | ? |
Erlang | ✗ | ✗ | D | ✓ | P | ✓ | ✗ | ✗ | ✗ | ✓ |
Python | ✗ | P | D | ✓ | ? | P | ✓ | ✓ | ✓ | ✓ |
Чистые функции
Чистота функций является одной из самых сильных сторон функционального программирования, поскольку это даёт возможность писать надёжные программы. Поскольку чистые функции зависят только от своих аргументов, то это даёт возможность быть уверенным в тестах на эти функции, а само написание тестов упрощается.
Ленивые вычисления
Ленивые вычисления позволяют не выполнять определённые функции до момента, пока результат их выполнения действительно не потребуется. В языке Scala это свойство языка работает через использование модификатора lazy
в опредлении значения переменной[lazy val]. В языке Python имеется частичная поддержка через генераторы.
Типизация
Ликбез по типизации в языках программирования
Абстрактные типы данных
Абстрактные типы данных — это тип данных со связанными операциями, реализация которых скрыта от разработчика.
Алгебраические типы данных
Алгебраический (индуктивный) тип данных — тип данных, состоящий из нескольких различимых разновидностей (возможно, составных) термов (значений).
Практика функционального программирования. Выпуск 3, с. 183
Среди языков программирования первым поддерживать простейший аналог алгебраических типов стал, судя по всему, Algol 68, в форме «united modes». Затем в форме «variant records» поддержка схожей и достаточно примитивной возможности появилась в Pascal и других языках. В конце 1970 гг. появился язык ML, поддерживавший современную форму алгебра- ических типов, включая рекурсивные и полиморфные алгебраические типы; эта же форма (с другим синтаксисом и с небольшими, но важными расши- рениями) используется в стандарте Haskell’98. ML положил начало другим статически типизированным функциональным языкам. Практически все они сейчас поддерживают алгебраические типы.
Язык Erlang имеет ограниченную поддержку алгебраических типов данных в кортежах и записях.
Неизменяемые данные
Неизменяемые данных в программировании — объекты, состоянии которых не может быть изменено после создания. Такие объекты важны тем, что они сами по себе являются потокобезопасными. В ООП для создания таких объектов используют шаблон неизменяемый интерфейс.
Классы типов
Классы типов являются разновидностью полиморфизма, которые позволяют применять функции к аргументам различных типов. Эта разновидность полиморфизма часто носит название перегрузка функций. Стоит отметить, что классы типов в ФП и классы ООП отличаются. Значением классов типов являются типы, что отражено в спецификации Haskell.