Подтвердить что ты не робот

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

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

Однако я не уверен, как структурировать гораздо меньше проектных приложений. Я использую идеи one-class-per-file и class-существительные/функции-глаголы в программировании OO. Как вы разрабатываете и структурируете функциональные приложения?

4b9b3361

Ответ 1

Прочитайте SICP.

Кроме того, существует версия PDF.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Сравните, например, модуль OCaml Stack с System.Collections.Generic.Stack от .NET или аналогичной коллекции на Java.

Ответ 8

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

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