При функциональном подходе обе эти
При функциональном подходе обе эти проблемы исчезают.
Дальнейшее обсуждение будет базироваться на популярном языке Standart ML, хотя эти понятия справедливы и для других языков.
16.2. Функции
Функции определяются в языке ML заданием равенства между именем функции с формальным параметром и выражением:
fun even n = (n mod 2 = 0)
Различие состоит в том, что здесь нет никаких глобальных переменных, никакого присваивания, никаких указателей и, следовательно, никаких побочных эффектов. После того как функция была определена, она может быть применена (applied), и вычисление (evaluation) ее применения и дает результат:
even 4 = true
even 5 = false
С каждой функцией связан тип, точно так же, как в языках программирования типы связаны с переменными. Тип функции even (четное) задается следующим образом:
even: int -> bool
Это означает, что она отображает значение целочисленного типа в значение булева типа.
В языке ML выражения могут содержать условия:
fun min (x,y) = if x < у then x else у
Приведем пример вычисления при применении функции:
min (4,5) =
(if x < у then x else у) (4,5) =
if 4 < 5 then 4 else 5 =
if true then 4 else 5 =
4
Обратите внимание, что это не if-оператор, а условное выражение, аналогичное имеющемуся в языке С:
х< у?х:у
Какой тип у min? В функциональном программировании считается, что функция имеет в точности один аргумент, если же вам требуется большее число аргументов, вы должны создать кортеж (двойной, тройной и т.д.), используя функцию декартова произведения. Таким образом, (4,5) имеет тип int x int, a функция min имеет тип:
min: (int x int) -> int
Вместо кортежей вы можете определить функцию, которая будет применяться к каждому аргументу по очереди:
fun min_c x у = if x < у then x else у
Это карризованная функция (curriedfunction, от имени математика Н.В.