Как вы разрабатываете функциональную программу?


с первого дня моей карьеры программиста я начал с объектно-ориентированного программирования. Тем не менее, я заинтересован в изучении других парадигм (то, что я сказал Здесь так много раз, это хорошо, но у меня не было времени). Я думаю, что я не только готов, но и имею время, поэтому я начну функциональное программирование с F#.

, Я не уверен, как структурировать гораздо меньше приложений. Я привык к одному классу на файл и класс-существительное / функция-глагольные идеи в программировании OO. Как вы проектируете и структурируете функциональные приложения?
8   52  

8 ответов:

читать SICP.

кроме того, есть PDF версию доступен.

вы можете проверить недавнюю запись в моем блоге:как функциональное программирование влияет на структуру вашего кода?

на высоком уровне методология проектирования OO по-прежнему весьма полезна для структурирования программы F#, но вы найдете это разрушение (больше исключений из правила), когда вы спускаетесь на более низкие уровни. На физическом уровне "один класс на файл" не будет работать во всех случаях, так как взаимно рекурсивные типы должны быть определены в одном файле (тип Class1 = ... и Class2 = ...), и немного вашего кода может находиться в" свободных "функциях, не привязанных к определенному классу (это то, для чего хороши F#"модуль"). Ограничения на порядок файлов в F# также заставят вас критически подумать о зависимостях между типами в вашей программе; это обоюдоострый меч, так как может потребоваться больше работы/мысли, чтобы распутать зависимости высокого уровня, но даст программы, которые организованы таким образом, что всегда делает они доступны (поскольку самые примитивные сущности всегда на первом месте, и вы всегда можете прочитать программу "сверху вниз" и ввести новые вещи один за другим, а не просто начать искать каталог, полный файлов кода, и не знать "с чего начать").

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

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

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

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

в любом случае, ответ-это небольшие "классы", и вместо изменения внутреннего состояния вам нужно вернуть новую версию с другим состоянием.

F# предоставляет обычные подходы OO для крупномасштабного структурированного программирования (например, интерфейсы) и не пытается предоставить экспериментальные подходы, впервые разработанные в таких языках, как OCaml (например, функторы).

следовательно, крупномасштабное структурирование программ F# по существу такое же, как и у программ C#.

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

о структурировании функциональных программ:

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

Я бы настоятельно рекомендую выбрать функциональный язык программирования удобно использовать (F#, OCaml, Haskell или Scheme) и долго смотреть на то, как структурирована его стандартная библиотека.

сравните, например, OCaml стек С

Это все о чистых функций и как составить их, чтобы построить большие абстракции. Это на самом деле сложная проблема, для которой надежные математические основы это. К счастью,есть несколько моделей с глубокими формальными и практическими исследованиями. На функциональное и реактивное моделирование предметной области Debasish Ghosh исследует эту тему дальше и объединяет несколько практических сценариев, применяя чистые функциональные шаблоны:

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