Схема - императив для функционального программирования - PullRequest
0 голосов
/ 03 марта 2012

Я только начал изучать функциональное программирование (схема).Но у меня все еще есть проблемы с мышлением "функционально".

Что-то вроде:

func1(int a){
   if(a==100)
      a=0;
   return func2(a);
}

Там есть изменение состояния, так что это обязательное программирование.

Если я возьму "Если "разнести и бросить в другую функцию, это делает его функциональным?

func1(int a){
   return func2(func3(a));
}

Это все о чем?

Спасибо!

1 Ответ

4 голосов
/ 03 марта 2012

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

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

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

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

Если вы напишите это так,

func1(int a) {
  return (
    if (a==100)
      then func(0);
      else func2(a);
    )
}

Теперь это чисто, но не особенно функционально и не обязательно.

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

square(x) = x * x
twice(f, x) = f(f(x))
twice(square, 4)
  => 256

Здесь мы определяем функцию square, которая умножает число на себя. Мы определяем другую функцию twice, которая принимает функцию и аргумент и применяет функцию к аргументу дважды. Затем мы даем функции twice аргументы square и 4. Обратите внимание, что это не twice(square(4)) - функция square не оценивается, пока в пределах определения функции twice.

...