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

Имеет ошибку с типом Int из-за ссылки на локальный case в моем перечислении, называемом .Int

func foo() { switch self { case .Int(var info): // ..... some other code } }

Там была ошибка someFuncWithInt(parameter: Int)

Исправлено с someFuncWithInt(parameter: Swift.Int)

68
задан Braiam 2 February 2017 в 22:55
поделиться

6 ответов

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

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

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

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

87
ответ дан Kyle Cronin 24 November 2019 в 14:15
поделиться

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

кроме того, у Dustin Campbell есть большой блог , где он отправил много статей о своих приключениях при набирании скорость с F#..

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

РЕДАКТИРОВАНИЕ:

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

6
ответ дан Rob Cooper 24 November 2019 в 14:15
поделиться

John, которого пример кода Статистика не показывает функциональному программированию, потому что при выполнении функционального программирования ключ - то, что код делает уроки (record = thingConstructor(t) присвоение), и оно не имеет НИКАКИХ ПОБОЧНЫХ ЭФФЕКТОВ (localMap.put(record), оператор с побочным эффектом). В результате этих двух ограничений все, что делает функция , полностью получено ее аргументами и ее возвращаемым значением. Перезапись кода Статистика путем, это должно было бы посмотреть, если бы Вы хотели эмулировать функциональный язык с помощью 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));
}

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

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

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

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

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

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

4
ответ дан 24 November 2019 в 14:15
поделиться

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

3
ответ дан robintw 24 November 2019 в 14:15
поделиться

Я предпочитаю использовать функциональное программирование для сохранения меня повторенная работа путем создания более абстрактной версии и затем использования этого вместо этого. Позвольте мне дать пример. В 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 является точно тем же, как это было бы, если я выписал все это, в одной строке, без зависимостей от наследования.

3
ответ дан John with waffle 24 November 2019 в 14:15
поделиться

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

, пишется совместно Don Syme. Создатель F#. Он работал над дженериками в.NET конкретно, таким образом, он мог создать F#.

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

2
ответ дан Brian Leahy 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: