Каковы некоторые хорошие практики при обучении декларативному программированию императивных программистов?


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 основан на структуре данных, а не на композиции, как в ООП. Я смотрел на что-то вроде List в C # как на хитрый трюк для генерации безопасных по типу списков, что-то, что составляло тип (string) в другой тип (list). После изучения FP я теперь смотрю на дженерики больше как на монады. Список - это структурированная форма, которую может принимать код, и он украшает строки.

Во-вторых, и, возможно, более полезной для программистов на C # / ASP, является идея, что FP работает над рекурсией и повторением, в то время как ООП работает с изменчивостью и зацикливанием. Сейчас я склонен думать о жизненном цикле 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.