Вот, например, код на Haskell: add a b = a + b
Вроде всё нормально, функция чистейшая. Но ведь можно записать и по-другому, с блекджеком замыканием и лямбдами: add = \a -> \b -> a + b
И вот тут уже кое-что становится непонятно. Вроде как обе функции должны быть чистыми (ведь "грязными", насколько я понял, в Haskell могут быть только функции типа IO() или что-нибудь подобное, здесь же -- самые обыкновенные функции). Но при этом лямбда \b -> a + b по идее не должна видеть переменную a. Но она видит. Значит она не чистая?
Можете, пожалуйста, объяснить, как замыкания сосуществуют с функциональной парадигмой?
Чистая. Рассмотрим foo = add 2, foo x для некоторого x всегда возвращает одно и то же значение, а также не производит никакого эффекта, наблюдаемого извне, и потому подпадает под определение чистой функции. Т.е. foo = add 2 идентичен функции foo x = 2 + x, которая, очевидно, чистая.
Александр Ручкин, я имел ввиду, что лямбда внутри не чистая. Конечная-то функция да, чистая. Но после комментария Александр все окончательно встало на свои места. Спасибо!