Функциональное программирование и нефункциональное Программирование


на втором курсе университета нас "учил" Хаскелл, я почти ничего об этом не знаю и еще меньше о функциональном программировании.

Что такое функциональное программирование, почему и/или где я хотел бы использовать его вместо нефункционального программирования и правильно ли я думаю, что C является нефункциональным языком программирования?

9 64

9 ответов:

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

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

Haskell вместо этого использует другой подход к IO: монады. Это объекты, которые содержат желаемую операцию ввода-вывода, выполняемую на верхнем уровне интерпретатора. На любом другом уровне они являются просто объектами в системе.

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

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

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

более старое определение (исходящее из Lisp) заключается в том, что функциональное программирование-это программирование с использованием первоклассных функций, т. е. где функции обрабатываются как любое другое значение, поэтому вы можете передавать функции в качестве аргументов другим функциям, а функция может возвращать функции среди их возвращаемых значений. Это достигает высшей точки при использовании функций более высокого порядка, таких как map и reduce (возможно, вы слышали о mapReduce как одна операция используется в значительной степени Google и, что неудивительно, это близкий родственник!). Интернет .Чистых типов System.Func и System.Action сделать функции более высокого порядка доступны в C#. Хотя карринг непрактичным в C# функции, которые принимают другие функции в качестве аргументов, являются общими, например,

может быть, стоит проверить эту статью на F# "101" на недавно опубликованном коде Mag.

и у Дастина Кэмпбелла отличный блог, где он опубликовал много статей о его приключениях на получение до скорости с F#..

Я надеюсь, что вы найдете их полезными :)

EDIT:

кроме того, просто добавить, мое понимание функционального программирования заключается в том, что все - это функция или параметры функции, вместо экземпляров / объектов с отслеживанием состояния.. Но я могу ошибаться F# - это то, что я умираю, чтобы попасть, но просто не хватает времени! :)

пример кода статистика Джона не показывает функциональное программирование, потому что когда вы делаете функциональное программирование, ключ в том, что код не выполняет никаких назначений ( record = thingConstructor(t) это назначение), и он не имеет побочных эффектов (localMap.put(record) это утверждение с побочным эффектом). В результате этих двух ограничений, все, что функции does полностью захватывается его аргументами и возвращаемым значением. Переписывая код статистики так, как он должен был бы выглядеть, если вы хотел эмулировать функциональный язык с помощью C++:

RT getOrCreate(const T thing, 
                  const Function<RT<T>> thingConstructor, 
                  const Map<T,RT<T>> localMap) {
    return localMap.contains(t) ?
        localMap.get(t) :
        localMap.put(t,thingConstructor(t));
}

в результате правила no side-effects каждый оператор является частью возвращаемого значения (следовательно return приходит первый), и каждое утверждение является выражением. В языках, которые применяют функциональное программирование,return ключевое слово подразумевается, а если оператор ведет себя как C++'S ?: оператора.

кроме того, все является неизменным, так что localMap.put нужно создать новую копию localMap и вернуть его, вместо того, чтобы изменить оригинал localMap, как обычная программа на C++ или Java. В зависимости от структуры localMap, копия может повторно использовать указатели в оригинал, уменьшая объем данных, которые должны быть скопированы.

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

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

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

функциональные языки как правило, имеют действительно большие среды выполнения. Haskell является исключением (исполняемые файлы GHC почти так же малы, как программы C, как во время компиляции, так и во время выполнения), но SML, Common Lisp и Scheme программы всегда требуют тонны памяти.

Да, вы правы, думая, что C является нефункциональным языком. С-это процедурный язык.

Я предпочитаю использовать функциональное программирование, чтобы сохранить себе повторную работу, сделав более абстрактную версию, а затем используя ее вместо этого. Позвольте мне привести пример. В Java я часто создаю карты для записи структур и, таким образом, пишу структуры getOrCreate.

SomeKindOfRecord<T> getOrCreate(T thing) { 
    if(localMap.contains(t)) { return localMap.get(t); }
    SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t);
    localMap = localMap.put(t,record);
    return record; 
}

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

RT<T> getOrCreate(T thing, 
                  Function<RT<T>> thingConstructor, 
                  Map<T,RT<T>> localMap) {
    if(localMap.contains(t)) { return localMap.get(t); }
    RT<T> record = thingConstructor(t);
    localMap = localMap.put(t,record);
    return record; 
}

и мне никогда не придется писать новый из них снова, я мог бы унаследовать его. Но я мог бы сделать один лучше тогда наследование, я мог бы сказать в конструкторе этой вещи

getOrCreate = myLib.getOrCreate(*,
                                SomeKindOfRecord<T>.constructor(<T>), 
                                localMap);

(где * - это своего рода нотация" оставьте этот параметр открытым", которая является своего рода каррингом)

и тогда локальный getOrCreate точно такой же, как если бы я написал все это в одной строке, без зависимостей наследования.

Если вы ищете хороший текст на F#

Эксперт F# в соавторстве с Доном Саймом. Создатель F#. Он работал над дженериками в .NET специально, чтобы он мог создать F#.

F# моделируется после OCaml, поэтому любой текст OCaml поможет вам изучить F#.

найти Что Такое Функциональное Программирование? чтобы быть полезным

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

предпочитают явное when параметр

public Program getProgramAt(TVGuide guide, int channel, Date when) {
  Schedule schedule = guide.getSchedule(channel);

  Program program = schedule.programAt(when);

  return program;
}

over

public Program getCurrentProgram(TVGuide guide, int channel) {
  Schedule schedule = guide.getSchedule(channel);

  Program current = schedule.programAt(new Date());

  return current;
}

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

в информатике функциональное программирование-это парадигма программирования-стиль построения структуры и элементов компьютерных программ,который рассматривает вычисление как оценку математических функций и избегает c висячие состояния и изменяемые данные. Это декларативная парадигма программирования, которая означает, что программирование выполняется с помощью выражений. В функциональном коде выходное значение функции зависит только от аргументов, которые вводятся в функцию, таким образом, вызов функции f дважды с одинаковым значением для аргумента x приведет к одному и тому же результату f(x) каждый раз. Устранение побочных эффектов, т. е. изменений состояния, не зависящих от входных данных функции, может значительно облегчить понимание и прогнозирование поведения программы, что является одной из ключевых мотиваций для развития функционального программирования. смотрите дополнительную информацию в wiki. некоторые примеры функциональных языков программирования, как scala, javascript...и т. д.