Строго говоря, функциональный язык pure - это функциональный язык (т. Е. Язык, где функции являются первоклассными значениями), где выражения не имеют побочных эффектов.Термин «чисто функциональный язык» является синонимом.
По этому определению Haskell не является чисто функциональным языком.Любой язык, на котором вы можете писать программы, отображающие их результаты, читать и записывать файлы, иметь графический интерфейс и т. Д., Не является чисто функциональным.Таким образом, ни один язык программирования общего назначения не является чисто функциональным (но существуют полезные предметно-ориентированные чисто функциональные языки: они, как правило, могут рассматриваться как встроенные языки в некотором роде).
В таких языках, какHaskell и Erlang можно считать чисто функциональными, но такие языки, как ML и Scheme, нельзя.Язык может считаться чисто функциональным, если существует достаточно большое, полезное и хорошо охарактеризованное подмножество, где побочные эффекты невозможны.Например, в Haskell все программы, тип которых не построен на IO
или другой монаде, обозначающей эффект, не имеют побочных эффектов.В Erlang все программы, которые не используют библиотеки ввода-вывода или функции параллелизма, не имеют побочных эффектов (это более сложная задача, чем в случае с Haskell).И наоборот, в ML или Scheme побочный эффект может быть скрыт в любой функции.
С этой точки зрения чисто функциональное подмножество Haskell можно рассматривать как встроенный язык для работы с поведением внутри каждой монадыКонечно, это странная перспектива, так как почти все вычисления происходят в этом «встроенном» подмножестве), и чисто функциональное подмножество Erlang можно рассматривать как встроенный язык, имеющий дело с локальным поведением.* Грэм Хаттон имеет несколько иной и довольно интересный взгляд на тему чисто функциональных языков :
Иногда термин «чисто функциональный»также используется в более широком смысле для обозначения языков, которые могут включать вычислительные эффекты, но без изменения понятия «функция» (о чем свидетельствует тот факт, что основные свойства функций сохраняются.) Как правило, оценка выражения может дать«задача», которая затем выполняется отдельновызывать вычислительные эффекты.Этапы оценки и выполнения разделены таким образом, что этап оценки не ставит под угрозу стандартные свойства выражений и функций.Например, механизмы ввода / вывода Haskell имеют такой тип.
Т.е. в Haskell функция имеет тип a -> b
и не может иметь побочных эффектов.Выражение типа IO (a -> b)
может иметь побочные эффекты, но это не функция.Таким образом, в Haskell функции должны быть чистыми, следовательно, Haskell является чисто функциональным.