2012-03-03 3 views
0

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

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

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

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

Если я возьму часть «if» и выброшу ее в другую функцию, это делает ее функциональной?

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

Это что, все о?

Спасибо!

ответ

4

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

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

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, которая принимает функцию и аргумент и дважды применяет функцию к аргументу. Затем мы приводим аргумент square и 4. Обратите внимание, что это не twice(square(4)) - функция square не оценивается до определения функции twice.

+1

«Ваша вторая функция не срабатывает при первом условии» Первое условие = использовать функции как примитивы? Извините, я не понимаю, почему мой второй код не работает, а ваш. – ercliou

+1

Я действительно сказал, что в моем примере нет ничего особенно функционального. Но он чист, так как он не вмешивается в состояние. Примером является только один 'if', в нем недостаточно, чтобы сделать его функциональным или нет. Это похоже на то, чтобы дать биологу пару нуклеотидов и спросить его, есть ли это дерево или куст. – Amadan

+3

Избегайте ненужных побочных эффектов (например, в примере OP), но мы иногда используем их. Через опыт можно найти баланс; в то время как «переподготовка», лучше всего ошибиться в направлении чистоты. –