Які є хороші практики, коли намагаються навчити декларативному програмуванню імперативних програмістів?


13

Я запропонував трохи тренуватися у F # у своїй компанії, і вони, схоже, виявляють певний інтерес. Вони, як правило, програмісти VB6 та C #, які не слідкують за програмою з надто великою пристрастю. Якщо говорити, я відчуваю, що простіше написати правильний код, коли ви думаєте про функціональне питання, тому вони обов'язково повинні отримати певну користь від цього.

Хто-небудь може запропонувати поради, як я повинен підійти до цього?

Ідеї

  • Не концентруйтесь на синтаксисі, натомість зосередьтесь на тому, як можна використовувати цю мову та ідіоми, які вона пропагує.
  • Спробуйте і придумайте приклади, які боляче писати в обов’язковому порядку, але перекладаються на елегантний код, коли він пишеться декларативно.

F # і декларативне програмування ?????
П Швед

@Pavel - це питання?
ChaosPandion

3
@Pavel - Гаразд, подбайте, щоб пояснити, чому ви зробили заяву? Це другий раз, коли ви робили надзвичайно розпливчасті коментарі. Це дуже грубо.
ChaosPandion

3
en.wikipedia.org/wiki/Declarative_programming Функціональне програмування - це тип декларативного програмування. Також +1, хороше запитання.
Зауважте, що потрібно самостійно придумати ім’я

2
@Chaos, на мій погляд, F # не підтримує декларативної парадигми програмування. Її нетерплячі оцінки та імперативні особливості роблять мову просто зручною, функціонально подібною формою позначення тих же імперативних висловлювань, які ви використовуєте, скажімо, на C #. Давай, навіть makeце більше декларативна мова, ніж F # або Caml! (За іронією долі, це полегшує вашу роботу.)
П Швед

Відповіді:


5

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

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

По-перше, стиль FP заснований на структурі даних, а не на композиції, як в OOP. Я розглядав щось на зразок List у C # як розумний трюк для створення безпечних для списку типів - те, що складало тип (рядок) в інший тип (список). Вивчивши FP, я дивлюся на дженерики більше схожих на Monads. Список - це структурована форма, яку може приймати код, і вона прикрашає рядки.

По-друге, і, можливо, більш корисно для програмістів на C # / ASP - це ідея, що FP працює на рекурсії та повторення, тоді як OOP працює на мутаційності та циклічності. Я схильний вважати життєвий цикл сторінки ASP як своєрідний FP зараз: кожен запит обробляється з нуля протягом усього життєвого циклу, тому вся сторінка, по суті, є однією великою повільно повторюваною програмою. Якщо ви можете звузити це поняття, ви отримаєте краще уявлення про те, як імперативна програма може бути структурована навколо циклів функцій, які беруть дані, працюють над ними та повертають нові дані замість зміни старих.

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



1

Багато імперативних мов програмування (Ada, C / C ++, Turbo Pascal, FoxPro) мають можливість визначати покажчик на функції або літерали імен процедури, які можна оцінювати (і процедури, названі за викликом літералу) під час виконання.

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

Як тільки це зануриться, ви можете почати заглиблюватися в інші речі (незмінність, нічого не поділити тощо)


Виправлення. Я маю на увазі те, що ви бачите, що ви можете визначити параметризовані алгоритми, які можуть приймати ІНШІ алгоритми як параметри та виконувати їх на структурах даних.
luis.espinal

1

Хто-небудь може запропонувати поради, як я повинен підійти до цього?

Звичайно:

  • Вибирайте приклади ретельно, щоб ваш F # код не тільки вирішував проблему елегантно, але й набагато елегантніше, ніж це можливо для C # / VB . Тут відповідають ваші друзі.

  • Скористайтеся одним прикладом, щоб виділити переваги нової функції, знайденої у F #, наприклад, асинхронні робочі процеси, активні візерунки.

  • Не бійтеся наводити нечисті приклади, використовуючи змінні структури даних, коли це доречно. F # нечиста причина.

  • Не представляйте F # як панацею. Опишіть програми, для яких F # недостатньо підходить, а також ті, для яких він набагато краще підходить, ніж інші мови .NET.

  • Укажіть на зразки іграшок, які вони можуть вивчити, а також успішні проекти в реальному світі, які використовували F # (Bing AdCenter, Halo 3 тощо).

  • Поясніть усе з точки зору того, як F # може допомогти їм легше вирішувати проблеми. Уникайте релігійних дебатів. Залишайтеся позитивними щодо F #, а не щодо інших мов. Озброюйте їх фактами та доказами, але нехай вони роблять власні висновки.

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