Что такое комбинатор
Является ли функцией или определением без свободных переменных? (как определено в SO)?
Или как насчет этого: согласно John Hughes в его хорошо известной статье о стрелках, "комбинатор - это функция, которая строит программные фрагменты из программы фрагменты" , что выгодно, потому что "... программист, использующий комбинаторы, автоматически создает большую часть желаемой программы, а не записывает каждую деталь вручную". Далее он говорит, что map
и filter
- два распространенных примера таких комбинаторов.
Некоторые комбинаторы, которые соответствуют первому определению:
- S
- K
- Y
- другие из Чтобы издеваться над пересмешником (возможно, я ошибаюсь - я не читал эту книгу)
Некоторые комбинаторы, которые соответствуют второму определению:
- Карта
- фильтр
- fold/reduce (предположительно)
- любой из → =, compose, fmap?????
Меня не интересует первое определение - это не поможет мне написать настоящую программу (+1, если вы убедите меня, что я ошибаюсь). Пожалуйста, помогите мне понять второе определение. Я думаю, что карта, фильтр и сокращение полезны: они позволяют мне программировать на более высоком уровне - меньше ошибок, более короткий и понятный код. Вот некоторые из моих конкретных вопросов о комбинаторах:
- Каковы примеры таких комбинаторов, как map, filter?
- Какие компиляторы часто используют языки программирования?
- Как комбатанты могут помочь мне разработать лучший API?
- Как создать эффективные комбинаторы?
- Что такое комбинаторы, похожие на нефункциональный язык (скажем, Java) или то, что эти языки используют вместо комбинаторов?
Обновить
Благодаря @C. А. Макканн, теперь у меня есть несколько лучшее понимание комбинаторов. Но для меня остается один вопрос:
В чем разница между функциональной программой, написанной с помощью одного, без использования большого количества комбинаторов?
Я подозреваю, что ответ заключается в том, что комбинатор-тяжелая версия короче, яснее, более общей, но я был бы признателен за более углубленное обсуждение, если это возможно.
Я также ищу больше примеров и объяснений сложных комбинаторов (т.е. более сложных, чем fold
) в общих языках программирования.