Каким будет хороший первый функциональный проект программирования? [закрыто]

19

Каким будет хороший первый функциональный проект программирования?

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

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

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

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

Meme
источник
1
«Какой язык мне выбрать» и вопросы выбора проекта здесь не по теме. Пожалуйста, смотрите FAQ и эту мета-дискуссию для получения более подробной информации.
Адам Лир

Ответы:

10

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

Некоторые идеи в грубом порядке сложности:

  • Генетические алгоритмы - напишите программу, которая разрабатывает решения для конкретной задачи, где решения представлены в виде простой DSL. Я повеселился, прежде чем создавать маленьких ботов, которые охотятся за едой в двумерной сетке и разрабатывают различные виды стратегий.

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

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

Я бы порекомендовал Clojure как прагматичный функциональный язык. Я использую его около 18 месяцев, и я очень доволен выбором. Основными причинами являются:

  • Параллелизм - Clojure имеет удивительную систему STM, которая, на мой взгляд, делает ее лучшим языком в мире на данный момент для многоядерного параллелизма. Смотрите видео по адресу: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, если вы хотите понять, почему это так особенное
  • Это Лисп - так что из-за философии «код - данные» он отлично подходит для макропрограммирования на основе макросов (программ, которые пишут программы, генетические алгоритмы и т. Д.).
  • Прагматичное функциональное программирование - стиль Clojure очень функциональный (большое внимание уделяется функциям более высокого порядка, ленивым последовательностям и т. Д.), Но он не совсем чистый, как Haskell. Есть много хороших инструментов для обработки нестабильного состояния и побочных эффектов
  • Динамический - Clojure по умолчанию является динамическим языком. Я считаю, что это большое повышение производительности. Однако вы можете при желании добавить подсказки к статическому типу позже, если вы хотите повысить производительность статической типизации.
  • Полностью скомпилированный - код Clojure всегда соблюдается (даже если вы делаете «eval»), так что вы получаете довольно приличную производительность - безусловно, лучше, чем большинство динамических языков, которые я использовал.
  • Вы получаете доступ ко всем библиотекам и инструментам в экосистеме JVM бесплатно. Таким образом, в отличие от академических языков с очень ограниченными доступными библиотеками, вы можете легко получить доступ ко всему во вселенной Java

Вы можете легко опробовать основы с:

  • Задача 4Clojure онлайн - ранние проблемы служат хорошим введением в изучение языка Clojure.
  • онлайн-репортаж Clojure по адресу http://www.try-clojure.org/
mikera
источник
Я выбрал ваш ответ на вопрос, потому что он ответил на все мои вопросы. Большое спасибо, что нашли время.
Мем
У Haskell тоже есть STM; (
альтернатива
@mikera: Для работы с JVM вы пробовали ABCL? Я попробовал это и сделал только маленький пример, но у меня почти нет опыта с этим. (У меня также есть книга Clojure в моем списке задач, но это другая история, мне любопытно, если у вас есть опыт работы с ABCL и Java).
Джорджио
@ Джорджио: ABCL, похоже, является достойной реализацией Common Lisp на JVM. OTOH Clojure обладает тем преимуществом, что он предназначен для JVM, включает в себя гораздо больше «современных» инноваций и дает больший импульс сообщества. Я думаю, что все сводится к тому, заботишься ли ты о поддержке обратной совместимости Common Lisp или нет.
Микера
9

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

Лучшее место для начала - это, вероятно, «Структура и интерпретация компьютерных программ» (SICP), основанная на диалекте Scheme на Лиспе. Это классический текст CS, и полный текст доступен онлайн (ссылка предоставлена).

Если вы хотите стать модным и использовать более современный функциональный язык, нацеленный на JVM, взгляните на Clojure. Есть даже адаптированная версия SICP специально для Clojure .

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

Джейсон Льюис
источник
Спасибо за предоставленную ссылку на книгу. Я собираюсь прочитать это, чтобы лучше понять.
Мем
Вы прочитали свой SICP сегодня?
MattyD
3

Количественный анализ

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

Я бы порекомендовал F # только потому, что я думаю, что это простой функциональный язык для начала, с хорошими инструментами и хорошей структурой, поддерживающей его. Другими альтернативами могут быть LISP и Clojure, но их немного сложнее выучить.

Homde
источник
На высоком уровне действительно верно, что вы можете делать много вещей функциональным образом. Например, люди использовали функциональные языки для описания экзотических выплат. Но по мере того, как вы переходите к базовым вещам, таким как вычисление PCA, решение нелинейных уравнений и т. Д., Алгоритмы становятся все более итеративными, и вам лучше кодировать их в старом стиле.
quant_dev
1
Я бы не сказал, что, по моему опыту, количественный анализ - это выполнение алгоритмов по сериям. Я реализовал квантовые вещи в C #, и они были в значительной степени согласованы с LINQ, по крайней мере, для такого рода теории портфеля
Homde
Как насчет реализации самих алгоритмов?
quant_dev
Я не вижу проблем в большинстве случаев, а вы? Возьмите вычисление коэффициента резкости, сначала вы рассчитываете годовой доход от ряда возвратов, а затем используете это значение с безрисковой ставкой и волатильностью: (yearizedizedReturn - riskFreeRate) / волатильностью. Ничто с функциональным языком не может справиться
Homde
Как насчет калибровки модели ценообразования?
quant_dev
3

Для начала вы можете попробовать реализовать небольшую игру в блэкджек на F #. Это домашнее задание, заданное в этом коротком видеоуроке . Решение также предоставляется в сети (и в одном из видео).

KNB
источник
2

Вы можете написать интерпретатор для схемы или LISP с OCaml.

davidk01
источник
Также следует отметить, что на этом языке есть даже книга на хаскеле о написании схемы на хаскеле.
альтернатива
2

О каком функциональном языке вы думали. Каждый из них имеет разные характеристики. Единственным языком, который оказал на меня наибольшее влияние, был Haskell, и я бы посоветовал вам сделать то же самое.


источник
Я думал о F # честно, главным образом потому, что в Дании Microsoft все популярно, но чем больше я читаю разные мнения, я сомневаюсь в этом решении. Мне нужен язык, который поможет мне выучить главным образом парадигму, и после того, как я уверен, нетрудно выучить другой, если мне это нужно или нужно.
Мем
Сильно зависит от того, где вы находитесь и чем занимаетесь. Для нас технологии программирования Microsoft бесполезны, поскольку они не поддерживают нашу основную платформу. Но я отвлекся: если вы хотите использовать F #, отлично, но затем откройте новый вопрос, специфичный для F #.
Я не хочу этим пользоваться. Я еще не принял решение. Вопрос о том, какой язык использовать, был второстепенным.
Мем
В этом случае найдите проект, а затем попросите рекомендации, как его решить. Например, Пролог отлично подходит для поиска дерева решений. Haskell отлично подходит для сопоставления с образцом. Lisp отлично подходит для создания и управления программами на Lisp во время выполнения в зависимости от ваших данных.
0

Вы также можете внести свой вклад в какой-нибудь проект с открытым исходным кодом.

Например, в проекте по языку программирования Фреге много работы. Например, вы можете позаботиться о переносе базовых библиотек на Haskell. Это сделало бы вас экспертом по Haskell, пока вы над ним работали.

Инго
источник