Является ли Фортран чисто функциональным языком? - PullRequest
2 голосов
/ 27 января 2020

Я понимаю, что некоторые языки объединяют элементы для множества различных парадигм в программировании. Мне сказали, что Фортран - это пример функционального языка, однако меня немного смущает вопрос, является ли он чисто функциональным, так как он, по-видимому, в основном используется для математических функций, однако я также читал, что это Можно ли применять объектно-ориентированное программирование и к Фортрану, так что это своего рода гибрид?

1 Ответ

7 голосов
/ 27 января 2020

«Я просто немного озадачен тем, является ли он чисто функциональным, так как он, по-видимому, в основном используется для математических функций»

Это неправильное представление о значении термина «чисто функциональный» и, возможно, также неправильное представление о значении термина «математическая функция».

математические функции

A математическая функция является отображением между входами и выходами:

В математике функция - это отношение между наборами, которое ассоциирует с каждым элементом первого набора ровно один элемент второго набора.

В контексте языков программирования входные данные для функции являются ее аргументами, а выходные данные - ее возвращаемым значением, поэтому, например, такая функция, как

def greeting(name):
    return 'Hello, ' + name

в Python, считается математической функцией тогда как такая функция, как

def print_square(x):
    print(x ** 2)
    return None

, не считается математической функцией. Отметим здесь, что, является ли вычисление математическим по своей природе, не имеет значения, является ли оно функцией в математическом смысле; print_square делает некоторую арифметику c, которая больше похожа на математику, чем greeting. Но greeting - это математическая функция, а print_square - нет.

greeting - это математическая функция, потому что это отображение набора строк в набор строк, и функцию можно описать какими входами связаны с какими выходами. Потребовалось бы бесконечно много строк, чтобы полностью выписать отображение, но отображение выглядит так:

'Alice'   → 'Hello, Alice'
'Bob'     → 'Hello, Bob'
'Charles' → 'Hello, Charles'
'####'    → 'Hello, ####'
''        → 'Hello, '
...

Каждый элемент в первом наборе (т. Е. Набор всех строк) связан ровно с одним элементом в второй набор, то есть greeting соответствует определению математической функции.

В отличие от этого print_square не является математической функцией в том смысле, что его нельзя описать путем сопоставления входов и выходов:

12 → None
4  → None
...

Эти отображения (от набора целых чисел до набора {None}) неправильно определяют, что делает print_square, то есть вычисляет квадрат ввода и выводит его в консоль .

Чтобы избежать путаницы с «функциями, которые делают что-то математическое», лучше использовать вычислительный термин « pure function »:

... чистая функция является вычислительным аналогом математической функции.

Итак, чтобы ответить на ваш комментарий, Фортран "в основном используется для математического веселья ctions ", Fortran в основном используется для выполнения математических вычислений , но это не то, что означает" математическая функция ".

Чисто функциональное программирование

A чисто функциональный язык программирования - это тот, где все вычисления выполняются с помощью чистых функций:

В информатике чисто функциональное программирование обычно обозначает парадигму программирования ..., которая рассматривает все вычисления как оценку математических функций. Чисто функциональное программирование также может быть определено путем запрета изменяющихся состояний и изменяемых данных.

Обратите внимание, что для языка программирования недостаточно разрешать писать чистые функции; это определение гласит: все вычисления должны выполняться чистыми функциями, чтобы язык квалифицировался как чисто функциональный.

Является ли Fortran чисто функциональным языком? Нет это не так. Подпрограммы в Фортране могут делать вещи, отличные от возвращаемых значений в соответствии с отображением между входом и выходом; и вычисления в Fortran могут быть сделаны с изменениями состояния и изменчивыми данными. Достаточно одного примера: этот пример взят из кода Розетты .

subroutine hs(number, length, seqArray)
  integer, intent(in)  :: number
  integer, intent(out) :: length  
  integer, optional, intent(inout) :: seqArray(:)
  integer :: n

  n = number
  length = 1
  if(present(seqArray)) seqArray(1) = n
  do while(n /= 1)
    if(mod(n,2) == 0) then
      n = n / 2
    else
      n = n * 3 + 1
    end if
    length = length + 1
    if(present(seqArray)) seqArray(length) = n
  end do
end subroutine

Переменная n явно изменчива, так как ее состояние изменяется в пределах al oop. Кроме того, массив seqArray является изменяемым, он является одновременно входом и выходом для подпрограммы, и подпрограмма изменяет состояние массива. Таким образом, эта подпрограмма не определяет чистую функцию и использует «изменяющееся состояние и изменяемые данные» , что запрещено определением чисто функционального языка.

Итак, подпрограмма hs не определяет «математическую функцию», даже если выполняемые ею вычисления имеют математический характер.

императивное программирование

императивное программирование это:

... парадигма программирования, которая использует операторы, которые изменяют состояние программы. ... императивная программа состоит из команд, которые должен выполнить компьютер.

Показанная выше подпрограмма Fortran соответствует обоим этим определениям: она использует операторы или команды, которые изменяют состояние программы, которое выполняет компьютер , Итак, Fortran является императивным языком программирования.

Обратите внимание, что в отличие от определения Википедии «чисто функциональный», язык может быть императивным, даже если он не выполняет все вычисления таким образом. Таким образом, хотя возможно писать чистые функции на Фортране, которые не работают при изменении состояния программы, Фортран крайне необходим; просто, возможно, не «чисто императивный».

«Что» против «Как»

«Это означало бы, что фортран описывает только« как »сделать что-то, а не« что » «он пытается это сделать?»

Часто говорят, что императивная программа - это та, которая говорит «как» должно быть выполнено вычисление, тогда как декларативная программа говорит только «что» должно быть сделано. Даже Википедия так говорит :

Императивное программирование фокусируется на описании как работает программа.

Этот термин часто используется в отличие от декларативное программирование, которое фокусируется на что программа должна выполнить sh без указания как программа должна достичь результата.

Так же как и код на Фортране описание того, «как» программа должна что-то делать или «что» должно быть выполнено sh?

Оператор типа n = n / 2 - это команда, приказывающая компьютеру что-то делать; перед тем, как компьютер выполнит команду, будет состояние программы, а затем - другое состояние программы. Оператор n = n / 2 также сообщает компьютеру «как» выполнить команду: разделите текущее значение n на 2 и сохраните результат в переменной n. Итак, в соответствии с различием «как» / «что», Фортран является императивным, а не декларативным.

Но вы можете возразить: n = n / 2 говорит «что» мы хотим достичь; новое состояние программы, где n хранит свое значение по сравнению со старым состоянием, разделенное на 2. И вы были бы правы, оно говорит, что, по крайней мере, для человека, читающего его.

То, что это показывает, - это то, что различие «как» / «что» слишком расплывчато, чтобы использовать его в качестве определения для определения, является ли язык обязательным или декларативным. Это подразумевается как слабо описанный контраст между этими парадигмами, а не как определение любой парадигмы. Чтобы решить, является ли язык обязательным или чисто функциональным, или в какой-либо другой парадигме, вам следует обратиться к пригодному для использования определению этой парадигмы.

...