Бессмысленный стиль рассматривается некоторыми авторами как ultimate функциональный стиль программирования.Проще говоря, функция типа t1 -> t2
описывает преобразование одного элемента типа t1
в другой элемент типа t2
.Идея состоит в том, что «точечные» функции (написанные с использованием явных переменных) подчеркивают элементов (когда вы пишете \x -> ... x ...
, вы описываете, что происходит с элементом x
), а «без точек»функции (выраженные без использования переменных) подчеркивают само преобразование как композицию более простых преобразований.Сторонники бессмысленного стиля утверждают, что преобразования действительно должны быть центральной концепцией, и что точечная нотация, хотя и проста в использовании, отвлекает нас от этого благородного идеала.
Бессмысленное функциональное программирование было доступно дляочень долгое время.Это было уже известно логикам, которые изучали комбинаторную логику со времени основательной работы Моисея Шенфинкеля в 1924 году, и послужило основой для первого исследования того, что станет выводом типа ML Робертом Фейсом и Haskell Curry в 1950-х годах.
Идея создания функций из выразительного набора базовых комбинаторов очень привлекательна и применяется в различных областях, таких как языки манипулирования массивами, полученные из APL или библиотеки комбинатора синтаксического анализа, такие как Haskell Parsec .Известный сторонник бессмысленного программирования - Джон Бэкус .В своей речи 1978 года «Может ли программирование быть освобождено от стиля фон Неймана?» Он писал:
Лямбда-выражение (с его правилами замещения) способно определять все возможные вычислимые функции всех возможных типови любого количества аргументов.Эта свобода и власть имеют как свои недостатки, так и очевидные преимущества.Это похоже на силу неограниченных контрольных операторов на традиционных языках: с неограниченной свободой приходит хаос.Если постоянно изобретать новые комбинированные формы, чтобы соответствовать случаю, как это можно сделать в лямбда-исчислении, вы не познакомитесь со стилем или полезными свойствами нескольких комбинированных форм, которые подходят для всех целей.Точно так же, как структурированное программирование избегает многих управляющих операторов, чтобы получить программы с более простой структурой, лучшими свойствами и единообразными методами для понимания их поведения, функциональное программирование избегает лямбда-выражений, подстановок и множественных типов функций.Тем самым он достигает программ, созданных с известными функциональными формами с известными полезными свойствами.Эти программы настолько структурированы, что их поведение часто можно понять и доказать с помощью механического использования алгебраических методов, подобных тем, которые используются при решении задач алгебры средней школы.
Итак, вот они.Основным преимуществом бессмысленного программирования является то, что они создают структурированный стиль комбинатора, который делает эквациональные рассуждения естественными.Сторонники движения «Squiggol» (см. [1] [2]) особенно рекламировали рациональные рассуждения и действительно используют значительную долю бессмысленных комбинаторов и правил вычислений / переписывания / рассуждений.
Наконец, одной из причин популярности бессмысленного программирования среди хаскеллитов является его отношение к теории категорий . В теории категорий морфизмы (которые можно рассматривать как «преобразования между объектами») являются основным объектом изучения и вычислений. В то время как частичные результаты позволяют выполнять рассуждение в определенных категориях в точечном стиле, общий способ построения, проверки и управления стрелками по-прежнему остается бессмысленным стилем, и другие синтаксисы, такие как строковые диаграммы, также демонстрируют эту «точечную чистоту». Между людьми, отстаивающими методы «алгебры программирования», и пользователями категорий в программировании существуют довольно тесные связи (например, авторы банановой статьи [2] являются / были категоричными категориями).
Вас может заинтересовать страница Pointfree вики Haskell.
Недостаток стиля pointfree довольно очевиден: чтение может быть настоящей болью. Причина, по которой мы все еще любим использовать переменные, несмотря на многочисленные ужасы затенения, альфа-эквивалентности и т. Д., Заключается в том, что это нотация, которую так естественно читать и думать. Общая идея состоит в том, что сложная функция (на прозрачном ссылочном языке) похожа на сложную систему сантехники: входные данные - это параметры, они попадают в некоторые каналы, применяются к внутренним функциям, дублируются (\x -> (x,x)
) или забываются (\x -> ()
, труба никуда не ведет) и т. Д. И нотация переменных приятно неявна для всего этого механизма: вы даете имя входу и имена на выходах (или вспомогательных вычислениях), но вам не нужно описывать все план сантехники, куда маленькие трубы пойдут, не будет помехой для больших и т. д. Количество сантехники внутри чего-то такого короткого, как \(f,x,y) -> ((x,y), f x y)
, удивительно. Вы можете следить за каждой переменной по отдельности или читать каждый промежуточный водопроводный узел, но вам никогда не придется видеть весь механизм вместе. Когда вы используете стиль без точек, все это явно, вы должны все записать и посмотреть на него потом, а иногда это просто безобразно.
PS: эта концепция слежения тесно связана с языками стекового программирования, которые, вероятно, являются наименее значимыми (едва используемыми) языками программирования. Я бы порекомендовал попробовать в них немного программировать, просто чтобы почувствовать это (как я бы рекомендовал логическое программирование). См. Коэффициент , Кошка или почтенный Далее .