Объяснение комбинаторов для рабочего

Что такое комбинатор ??

Это » функция или определение без свободных переменные » (как определено в SO)?

Или как насчет этого: согласно Джона Хьюза в его известной статье о Стрелках, « комбинатор - это функция, которая строит программные фрагменты из программных фрагментов », что является преимуществом, потому что« ... программист, использующий комбинаторы, создает большую часть желаемой программы автоматически, а не записывает каждую деталь вручную ». Далее он говорит, что map и фильтр - два общих примера таких комбинаторов.

Некоторые комбинаторы, которые соответствуют первому определению:

  • S
  • K
  • Y
  • другие из К Mock a Mockingbird (я могу ошибаться - я не читал эту книгу)

Некоторые комбинаторы, соответствующие второму определению:

  • map
  • filter
  • fold / reduce (предположительно)
  • any of >> =, compose, fmap ?????

Меня не интересует первое определение - оно не поможет мне написать настоящую программу (+1, если вы убедите меня, что я ошибаюсь) . Пожалуйста, помогите мне понять второе определение . Я считаю, что map, filter и reduce полезны: они позволяют мне программировать на более высоком уровне - меньше ошибок, короче и понятнее код.Вот некоторые из моих конкретных вопросов о комбинаторах:

  1. Какие еще примеры комбинаторов, таких как map, filter?
  2. Какие комбинаторы часто реализуют языки программирования?
  3. Как комбинаторы могут помочь мне разработать лучший API?
  4. Как разработать эффективные комбинаторы?
  5. На что похожи комбинаторы в нефункциональном языке (скажем, Java), или что эти языки используют вместо комбинаторов?

Обновление

Благодаря @C. А. Макканн, теперь я немного лучше понимаю комбинаторы. Но один вопрос все еще остается камнем преткновения для меня:

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

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

Я также ищу больше примеров и объяснений сложных комбинаторов (т.е. более сложных, чем fold ) в распространенных языках программирования.

91
задан Matt Fenwick 8 March 2012 в 19:50
поделиться