Що було б хорошим першим функціональним проектом програмування? [зачинено]


19

Що було б хорошим першим функціональним проектом програмування?

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

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

Як би ви сказали, що це проект з гарної практики, який є дещо складним, але також дозволяє мені вивчити мову, парадигму тощо. І що, на вашу думку, було б хорошим проектом (більш просунутим) для мого бакалаврського проекту?

Пропозиції щодо найкращої мови для початку при функціональному програмуванні також будуть вдячні.


1
"Яку мову мені вибрати", а питання щодо вибору проектів тут є поза темою. Будь ласка, дивіться поширені запитання та цю мета-дискусію для отримання детальної інформації.
Адам Лір

Відповіді:


10

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

Деякі ідеї, в грубому порядку складності:

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

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

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

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

  • Паралельність - Clojure має дивовижну систему STM, яка, на мою думку, робить її найкращою мовою у світі на даний момент для багатоядерної одночасності. Дивіться відео за адресою: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, якщо ви хочете зрозуміти, чому це так особливо
  • Це Lisp - тому завдяки філософії "code is data" це фантастично для метапрограмування на основі макросу (програми, що записують програми, генетичні алгоритми тощо)
  • Прагматичне функціональне програмування - стиль Clojure дуже функціональний (великий акцент на функціях вищого порядку, ліниві послідовності тощо), але він не зовсім чистий, як Haskell. Існує безліч приємних інструментів для обробки стану mtable та побічних ефектів
  • Dynamic - Clojure - це динамічна мова за замовчуванням. Я вважаю це великим підвищенням продуктивності. Однак ви можете додатково додавати підказки статичного типу пізніше, якщо ви хочете отримати переваги щодо ефективності статичного набору тексту.
  • Повністю скомпільований - Код Clojure завжди дотримується (навіть якщо ви робите "eval"), тому ви отримуєте досить пристойну продуктивність - безумовно, кращу, ніж більшість динамічних мов, якими я користувався.
  • Ви отримуєте доступ до всіх бібліотек та інструментів в екосистемі JVM безкоштовно. Тож на відміну від академічних мов, у яких доступні дуже обмежені бібліотеки, ви можете легко отримати доступ до будь-якого місця у Всесвіті Java

Ви можете спробувати основи дуже легко за допомогою:

  • 4Clojure набір онлайн проблема - ранні проблеми служать хорошим «навчання на практиці» введення в мову Clojure
  • онлайн-відповідь Clojure за адресою http://www.try-clojure.org/

Я вибрав вашу відповідь на запитання, оскільки він відповів на всі мої запитання. Дуже дякую, що знайшли час.
Меме

У Haskell також є STM; (
альтернатива

@mikera: Ви працювали з JVM, ви пробували ABCL? Я спробував це і зробив лише невеликий приклад, але у мене майже немає досвіду з цим. (У мене також є книга Clojure в моєму списку todo, але це вже інша історія, мені цікаво, якщо у вас є досвід роботи з ABCL та Java).
Джорджіо

@Giorgio: ABCL здається, що це гідна реалізація Common Lisp на JVM. OTOH Clojure має переваги в тому, що він розроблений для спільного впровадження, включаючи набагато більше "сучасних" інновацій та більше імпульсу громади. Я думаю, що це дійсно зводиться до того, чи дбаєте ви про підтримку загальної сумісності Lisp назад чи ні.
mikera

9

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

Найкраще місце для початку - це, мабуть, Структура та інтерпретація комп’ютерних програм (SICP), яка базується на діалектному схемі Lisp. Це класичний текст CS, а повний текст доступний в Інтернеті (надається посилання).

Якщо ви хочете пофантазувати і використовувати більш сучасну функціональну мову, орієнтовану на JVM, погляньте на Clojure. Існує навіть адаптована версія SICP спеціально для Clojure .

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


Дякуємо, що надали посилання на книгу. Я збираюся прочитати це, щоб краще зрозуміти.
Меме

Ви сьогодні читали свій SICP?
MattyD

3

Кількісний аналіз

Якщо вам здається, що фінанси цікаві, виконувати якісь речі з функціональним програмуванням - це дуже добре, оскільки це дуже алгоритмічно. Я говорю про теорію портфоліо і такі речі, як коефіцієнти різкості та сортування тощо. Створіть додаток, який аналізує прибутки фонду та дає різні статистичні дані, діаграми тощо.

Я б рекомендував F # лише тому, що я думаю, що це легка функціональна мова для початку роботи, має хороші інструменти та хороші рамки, що підтримують її. Інші альтернативи - це ліпша і притаманна, але їх навчити трохи складніше.


На високому рівні справді вірно, що ви можете багато чого робити у функціональному порядку. Люди використовували функціональні мови, наприклад, для опису виплат за екзотичні варіанти. Але коли ви переходите до основного матеріалу, як-от обчислення PCA, розв’язування нелінійних рівнянь тощо, алгоритми стають все більш ітераційними, і вам краще кодувати їх за старим стилем.
Quant_dev

1
Я б не сказав, що в моєму досвіді кількісний аналіз стосується роботи алгоритмів по рядах. Я реалізував кількість матеріалів у C #, і це було дуже узгоджено з LINQ, принаймні, для теорії портфоліо такого роду речі
Хомде

Що з реалізацією самих алгоритмів?
Quant_dev

Я не бачу жодної проблеми в більшості випадків, чи не так? Візьміть обчислення коефіцієнта різкості, спочатку ви обчислюєте річний прибуток із серії повернень, потім використовуєте це значення зі ступенем безризиковості та мінливістю: (annualizedReturn - riskFreeRate) / мінливість. Нічого, що функціональна мова не може впоратися
Хомде

А як щодо калібрування моделі ціноутворення?
Quant_dev

3

Для початку ви можете спробувати реалізувати маленьку гру в блекджек у F #. Це проект домашнього завдання, призначений під час цього короткого відеоуроку . Рішення також надається в мережі (і в одному з відео).


2

Ви можете написати інтерпретатора схеми або поспілкуватися з OCaml.


Також слід зазначити, що є навіть книга haskell про цю схему написання в haskell.
альтернатива

2

Яку функціональну мову ви думали. Кожен має різні характеристики. Єдиною мовою, яка справила найбільший вплив на мене, була Хаскелл, і я б запропонував вам зробити те саме.


Я думав про F # чесно головним чином тому, що в Данії Microsoft все популярно, але чим більше я читаю різні думки, я сумніваюся в цьому рішенні. Я хочу мову, яка допоможе мені в основному вивчити парадигму, і після того, як я впевнений, що важко вивчити іншу, якщо мені це потрібно чи я хочу.
Меме

Сильно залежить від того, де ти є і що робиш. Для нас технології програмування Microsoft марні, оскільки вони не підтримують нашу основну платформу. Але я відволікаюсь: якщо ви хочете використовувати F #, чудово, але тоді відкрийте нове конкретне питання F #.

Я не хочу цим користуватися. Я ще не прийняв рішення. Питання про мову для використання в будь-якому разі було другорядним.
Меме

У такому випадку знайдіть проект, а потім попросіть рекомендації, як його вирішити. Наприклад, Prolog відмінно підходить для пошуку дерева рішень. Haskell чудово підходить для узгодження моделей. Lisp чудово підходить для створення та керування програмами Lisp під час виконання програми, залежно від ваших даних.

0

Ви також можете внести свій внесок у якийсь проект з відкритим кодом.

Наприклад, у мовному проекті програмування Frege ще багато роботи. Наприклад, ви можете подбати про перенесення базових бібліотек Haskell. Це зробить вас начебто експертом Haskell, коли ви працюєте над цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.