То, что функциональный язык является функциональным (возможно, даже полностью чистым, как Haskell!), Не означает, что программы, написанные на этом языке, должны быть чистыми при запуске.
Подход Haskell, например, когдаРабота с побочными эффектами может быть объяснена довольно просто: пусть вся программа сама по себе является чистой (это означает, что функции всегда возвращают одни и те же значения для одних и тех же аргументов и не имеют побочных эффектов), но пусть возвращаемое значение main
function - действие, которое можно запустить.
Попытка объяснить это с помощью псевдокода, вот некоторая программа на императив , нефункциональный язык:
main:
read contents of abc.txt into mystring
write contents of mystring to def.txt
Вышеприведенная процедура main
- это просто последовательность шагов, описывающая, как выполнить серию действий.
Сравните это с чисто функциональным языкомкак Хаскелл.В функциональных языках все является выражением, включая основную функцию.Таким образом, можно прочитать эквивалент вышеупомянутой программы следующим образом:
main = the reading of abc.txt into mystring followed by
the writing of mystring to def.txt
Итак, main
- это выражение, которое при оценке вернет действие, описывающее, что делать для выполнения программы.Фактическое выполнение этого действия происходит за пределами мира программистов.И это действительно, как это работает;ниже приведена фактическая программа на Haskell, которую можно скомпилировать и запустить:
main = readFile "abc.txt" >>= \ mystring ->
writeFile "def.txt" mystring
a >>= b
можно сказать как "действие a
, за которым следует результат a
, данный для действия b
"в этой ситуации, и результатом работы оператора являются комбинированные действия a и b.Вышеприведенная программа, конечно, не является идиоматическим Haskell;можно переписать его следующим образом (удалив лишнюю переменную):
main = readFile "abc.txt" >>=
writeFile "def.txt"
... или, используя синтаксический сахар и нотацию:
main = do
mystring <- readFile "abc.txt"
writeFile "def.txt" mystring
Все вышеперечисленные программыне только эквивалентны, но и идентичны в том, что касается компилятора.
Таким образом, файлы, системы баз данных и веб-серверы могут быть написаны как чисто функциональные программы: с помощью потоковЗначения действий через программу, так что они объединяются и, наконец, заканчиваются функцией main
.Это дает программисту огромный контроль над программой, и поэтому чисто функциональные языки программирования так привлекательны в некоторых ситуациях.