Молчаливое программирование , также называемое безточечным стилем , представляет собой парадигму программирования, в которой определения функций не идентифицируют аргументы (или «точки»), с которыми они работают. Вместо этого определения просто составляют другие функции, среди которых есть комбинаторы, которые манипулируют аргументами. Неявное программирование представляет теоретический интерес, потому что строгое использование композиции приводит к программам, которые хорошо адаптированы для эквациональных рассуждений. [1] Это также естественный стиль некоторых языков программирования , включая APL и его производные, [2] иконкатенативные языки, такие как Forth . Отсутствие аргументации в названии дает бессмысленному стилю репутацию излишне неясного, отсюда и эпитет «бессмысленный стиль». [1]
В сценариях Unix используется парадигма каналов .
Ключевая идея в неявном программировании - помочь в работе на соответствующем уровне абстракции.
Примеры
Python
Неявное программирование можно проиллюстрировать с помощью следующего кода Python . Последовательность операций, такая как следующая:
def example ( x ): y = foo ( x ) z = bar ( y ) w = baz ( z ) return w
... записывается в бесточечном стиле как композиция последовательности функций без параметров: [3]
из functools import partial , reduce def compose ( * fns ): return partial ( reduce , lambda v , fn : fn ( v ), fns )пример = составить ( baz , bar , foo )
Для более сложного примера код Haskell p = ((.) f) . g
можно перевести как:
p = partial ( составить , частично ( составить , f ), g )
Функциональное программирование
Простой пример (в Haskell ) - это программа, которая вычисляет сумму списка чисел. Мы можем определить функцию суммы рекурсивно, используя заостренный стиль (см. Программирование на уровне значений ) как:
sum ( x : xs ) = x + sum xs sum [] = 0
Однако, используя складку, мы можем заменить это на:
сумма xs = foldr ( + ) 0 xs
И тогда аргумент не нужен, поэтому это упрощает
сумма = foldr ( + ) 0
что бессмысленно.
В другом примере используется композиция функций :
p x y z = f ( g x y ) z
Следующий псевдокод, похожий на Haskell, демонстрирует, как уменьшить определение функции до его бесточечного эквивалента:
p = \ x -> \ y -> \ z -> f ( g x y ) z = \ x -> \ y -> f ( g x y ) = \ x -> \ y -> ( f . ( g х )) у = \ х -> е . ( Г х ) ( * Здесь инфиксное Сотрозе оператор "" будет использоваться в качестве более выделанной функции . * ) = \ Х -> (( . ) Е ) ( г х ) = \ х -> ((( . ) Е ) . ж ) х p = (( . ) f ) . грамм
Наконец, чтобы увидеть сложный пример, представьте программу фильтрации карты, которая берет список, применяет к нему функцию, а затем фильтрует элементы на основе критерия
список операторов критериев mf = критерии фильтрации ( список операторов карты )
Его можно выразить бесточечным [4] как
mf = ( . карта ) . ( . ) . фильтр
Обратите внимание, что, как указывалось ранее, точки в «без точек» относятся к аргументам, а не к использованию точек; распространенное заблуждение. [5]
Было написано несколько программ для автоматического преобразования выражения Haskell в бесточечную форму.
Семья APL
В J такой же беспоточечный код встречается в функции, предназначенной для вычисления среднего значения списка (массива) чисел:
avg =: + / % #
+/
суммирует элементы массива, сопоставляя ( /
) sumutation ( +
) с массивом. %
делит сумму на количество элементов ( #
) в массиве.
Формула Эйлера молчаливо выражалась:
cos =: 2 o . ] sin =: 1 o . ] Эйлер =: ^ @ j . = cos j . грех
( j.
является примитивной функцией, монадическое определение которой - 0j1
умножение на x, а диадическое определение - x+0j1×y
.) Те же неявные вычисления, выраженные в Dyalog APL :
в среднем ← + ⌿ ÷ ≢сов ← 2 ○ ⊢ грешить ← - ○ ⊢ J ← { ⍺ ← 0 ⋄ ⍺ + 0j1 × ⍵ } ⍝ эта часть не подразумеваемый Эйлер ← * ∘ J = сов J греха
На основе стека
В языках программирования, ориентированных на стек (и конкатенативных языках , большинство из которых основано на стеке [ необходима цитата ] ), обычно используются методы без точек. Например, процедура вычисления чисел Фибоначчи в PostScript может выглядеть следующим образом :
/ fib { dup dup 1 eq exch 0 eq или нет { dup 1 sub fib exch 2 sub fib add } if } def
Конвейер Unix
В сценариях Unix функции - это компьютерные программы, которые получают данные со стандартного ввода и отправляют результаты на стандартный вывод . Например,
сортировать | uniq -c | sort -rn
- это неявная или бессмысленная композиция, которая возвращает количество своих аргументов и аргументов в порядке убывания их. «Sort» и «uniq» - это функции, «-c» и «-rn» управляют функциями, но аргументы не упоминаются. Труба '|' - оператор композиции.
Из-за того, как работают конвейеры, обычно можно передавать только один «аргумент» за раз в виде пары стандартных потоков ввода / вывода. Хотя дополнительные файловые дескрипторы можно открывать из именованных каналов , это больше не является безточечным стилем.
Смотрите также
Рекомендации
- ^ a b Мануэль Альчино Перейра да Кунья (2005) Расчет программы без баллов
- ^ В. Невилл Холмс, изд. (2006) Компьютеры и люди
- ^ «Код имени, а не значения» . Concatenative.org . Проверено 13 сентября 2013 года .
- ^ pipermail
- ^ «Pointfree - HaskellWiki» . wiki.haskell.org . Проверено 5 июня 2016 .
Внешние ссылки
- Чистые функции в APL и J Как использовать неявное программирование на любом APL-подобном языке
- Закрытые прикладные языки 1971 - 1976 и далее , в John W. Backus (Publications)