Молчаливое программирование - Tacit programming

Молчаливое программирование, также называемый безточечный стиль, это парадигма программирования в которых определения функций не идентифицируют аргументы (или «точки»), на которых они действуют. Вместо этого определения просто сочинять другие функции, среди которых комбинаторы которые манипулируют аргументами. Неявное программирование представляет теоретический интерес, поскольку строгое использование композиции приводит к программам, хорошо адаптированным для эквациональный рассуждения.[1] Это также естественный стиль некоторых языки программирования, включая APL и его производные,[2] и конкатенативные языки Такие как Четвертый. Отсутствие аргументации в названии дает бессмысленному стилю репутацию излишне неясного, отсюда и эпитет «бессмысленный стиль».[1]

Unix сценарии использует парадигму с трубы.

Ключевой идеей неявного программирования является помощь в работе на соответствующем уровне абстракции.

Примеры

Python

Молчаливое программирование можно проиллюстрировать следующим Python код. Последовательность операций, такая как следующая:

def пример(Икс):    у = фу(Икс)    z = бар(у)    ш = баз(z)    возвращаться ш

... записывается в бесточечном стиле как композиция последовательности функций без параметров:[3]

из functools импорт частичный, уменьшатьdef сочинять(*фнс):    возвращаться частичный(уменьшать, лямбда v, fn: fn(v), фнс)пример = сочинять(баз, бар, фу)

Для более сложного примера код Haskell р = ((.) е). грамм можно перевести как:

п = частичный(сочинять, частичный(сочинять, ж), грамм)

Функциональное программирование

Простой пример (в Haskell ) - это программа, которая принимает сумму списка. Программист может определить сумму рекурсивно, используя заостренный (ср. ценить-уровневое программирование ) как:

сумма (Икс:хз) = Икс + сумма хзсумма [] = 0

Однако, отмечая это как складывать программист может заменить это на:

сумма хз = складной (+) 0 хз

И тогда аргумент не нужен, поэтому его можно заменить на

сумма = складной (+) 0

что бессмысленно.

Другой пример использует функциональная композиция:

п Икс у z = ж (грамм Икс у) z

Следующий псевдокод, похожий на Haskell, демонстрирует, как уменьшить определение функции до его бесточечного эквивалента:

п = Икс -> у -> z -> ж (грамм Икс у) z  = Икс -> у -> ж (грамм Икс у)  = Икс -> у -> (ж . (грамм Икс)) у  = Икс -> ж . (грамм Икс)  (* Здесь то инфикс сочинять оператор "." является использовал в качестве а карри функция. *)  = Икс -> ((.) ж) (грамм Икс)  = Икс -> (((.) ж) . грамм) Иксп = ((.) ж) . грамм

Наконец, чтобы увидеть сложный пример, представьте программу фильтрации карты, которая берет список, применяет к нему функцию, а затем фильтрует элементы на основе критерия

мф критерии оператор список = фильтр критерии (карта оператор список)

Это может быть выражено бессмысленно[4] в качестве

мф = (. карта) . (.) . фильтр

Обратите внимание, что, как указывалось ранее, точки в «без точек» относятся к аргументам, а не к использованию точек; распространенное заблуждение.[5]

Было написано несколько программ для автоматического преобразования выражения Haskell в бесточечную форму.

Семья APL

В J, такой же беспоточечный код встречается в функции, предназначенной для вычисления среднего значения списка (массива) чисел:

средний=: +/ % #

+/ суммирует элементы массива путем сопоставления (/) суммирование (+) в массив. % делит сумму на количество элементов (#) в массиве.

Формула Эйлера молчаливо выразился:

потому что =: 2 о. ]грех =: 1 о. ]Эйлер =: ^@j. = потому что j. грех

(j. примитивная функция, монадическое определение которой 0j1 умножить на x и чье диадическое определение х + 0j1 × у.) Те же неявные вычисления, выраженные в Dyalog APL:

средний  + ÷ потому что  2  грех  1  j    {0  +0j1×}  ⍝ эта часть не молчаливаяЭйлер  *j = потому что j грех

На основе стека

В стек-ориентированные языки программированияконкатенативные, большинство из которых основаны на стеке[нужна цитата ]), обычно используются бесточечные методы. Например, процедура для вычисления Числа Фибоначчи может выглядеть так в PostScript:

/ fib{   обман обман 1 экв обменять 0 экв или же нет   {      обман 1 суб выдумать      обменять 2 суб выдумать      Добавить   } если} def

Конвейер Unix

В сценариях Unix функции - это компьютерные программы, которые получают данные от стандартный ввод и отправьте результаты в стандартный вывод. Например,

Сортировать | uniq -c | sort -rn

- это неявная или бессмысленная композиция, которая возвращает количество своих аргументов и аргументов в порядке убывания их. «Sort» и «uniq» - это функции, «-c» и «-rn» управляют функциями, но аргументы не упоминаются. Труба '|' - оператор композиции.

Из-за того, как работают конвейеры, обычно можно передавать только один «аргумент» за раз в виде пары стандартных потоков ввода / вывода. Однако дополнительные файловые дескрипторы можно открыть из именованные каналы.

Смотрите также

Рекомендации

  1. ^ а б Мануэль Альчино Перейра да Кунья (2005) Расчет программы без баллов
  2. ^ В. Невилл Холмс, изд. (2006) Компьютеры и люди
  3. ^ «Код имени, а не значения». Concatenative.org. Получено 13 сентября 2013.
  4. ^ кольчуга
  5. ^ "Pointfree - HaskellWiki". wiki.haskell.org. Получено 2016-06-05.

внешняя ссылка