Tiché programování - Tacit programming
Tiché programování , nazývané také bezbodový styl , je paradigma programování, ve kterém definice funkcí neidentifikují argumenty (neboli „body“), na nichž působí. Místo toho definice pouze skládají další funkce, mezi nimiž jsou kombinátory, které manipulují s argumenty. Tiché programování je teoreticky zajímavé, protože přísné používání kompozice má za následek programy, které jsou dobře přizpůsobeny pro rovníkové uvažování. Je to také přirozený styl určitých programovacích jazyků , včetně APL a jeho derivátů, a zřetězení , jako je Forth . Absence pojmenování argumentů dává stylu bez bodů pověst zbytečně nejasného, a proto epiteton „nesmyslný styl“.
Unixové skriptování využívá paradigma s dýmkami .
Klíčovou myšlenkou v tichém programování je pomoci při provozu na příslušné úrovni abstrakce.
Příklady
Krajta
Tiché programování lze ilustrovat následujícím kódem Pythonu . Sekvence operací, jako jsou následující:
def example(x):
y = foo(x)
z = bar(y)
w = baz(z)
return w
... je psán bezbodovým stylem jako složení posloupnosti funkcí bez parametrů:
from functools import partial, reduce
def compose(*fns):
return partial(reduce, lambda v, fn: fn(v), fns)
example = compose(foo, bar, baz)
Pro složitější příklad p = ((.) f) . g
lze kód Haskell přeložit jako:
p = partial(compose, partial(compose, f), g)
Funkcionální programování
Jednoduchým příkladem (v Haskellu ) je program, který vypočítá součet seznamu čísel. Můžeme definovat funkci sum rekurzivně pomocí špičatého styl (srov hodnota úrovňového programování ) jako:
sum (x:xs) = x + sum xs
sum [] = 0
Pomocí záhybu to však můžeme nahradit:
sum xs = foldr (+) 0 xs
A pak není argument zapotřebí, takže se to zjednodušuje
sum = foldr (+) 0
což je bez bodů.
Další příklad používá funkční složení :
p x y z = f (g x y) z
Následující pseudokód podobný Haskellu odhaluje, jak redukovat definici funkce na její ekvivalent bez bodů:
p = \x -> \y -> \z -> f (g x y) z
= \x -> \y -> f (g x y)
= \x -> \y -> (f . (g x)) y
= \x -> f . (g x)
(* Here the infix compose operator "." is used as a curried function. *)
= \x -> ((.) f) (g x)
= \x -> (((.) f) . g) x
p = ((.) f) . g
Nakonec si pro zobrazení komplexního příkladu představte program pro filtrování map, který přebírá seznam, aplikuje na něj funkci a poté filtruje prvky na základě kritéria
mf criteria operator list = filter criteria (map operator list)
Může být vyjádřen bez bodů jako
mf = (. map) . (.) . filter
Všimněte si, že, jak již bylo uvedeno, body v bodě bez bodů odkazují na argumenty, nikoli na použití teček; běžná mylná představa.
Bylo napsáno několik programů, které automaticky převádějí výraz Haskell na bezbodovou formu.
Rodina APL
V J se stejný druh bezbodového kódu vyskytuje ve funkci vytvořené pro výpočet průměru seznamu (pole) čísel:
avg=: +/ % #
+/
sečte položky pole mapováním ( /
) summation ( +
) na pole. %
dělí součet počtem prvků ( #
) v poli.
Eulerův vzorec mlčky vyjádřil:
cos =: 2 o. ]
sin =: 1 o. ]
Euler =: ^@j. = cos j. sin
( j.
je primitivní funkce, jejíž monadická definice je 0j1
krát x a jejíž dyadická definice je x+0j1×y
.) Stejné tiché výpočty vyjádřené v Dyalog APL :
avg ← +⌿ ÷ ≢
cos ← 2 ○ ⊢
sin ← 1 ○ ⊢
j ← {⍺←0 ⋄ ⍺+0j1×⍵} ⍝ this part is not tacit
Euler ← *∘j = cos j sin
Stack-based
V programovacích jazycích orientovaných na zásobník (a v těch zřetězených , z nichž většina je založená na zásobníku) se běžně používají metody bez bodů. Například postup pro výpočet Fibonacciho čísel může v PostScriptu vypadat následovně :
/fib
{
dup dup 1 eq exch 0 eq or not
{
dup 1 sub fib
exch 2 sub fib
add
} if
} def
Unixové potrubí
Ve skriptování Unix jsou funkce počítačové programy, které přijímají data ze standardního vstupu a odesílají výsledky na standardní výstup . Například,
sort | uniq -c | sort -rn
je tichá nebo bezbodová kompozice, která vrací počty svých argumentů a argumentů v pořadí klesajících počtů. Funkce 'sort' a 'uniq' jsou funkce, funkce '-c' a '-rn' řídí funkce, ale argumenty zde nejsou uvedeny. Trubka '|' je operátor kompozice.
Vzhledem ke způsobu fungování potrubí je normálně možné předat vždy jen jeden „argument“ ve formě dvojice standardního vstupního/výstupního proudu. Ačkoli lze z pojmenovaných kanálů otevřít další deskriptory souborů , toto již nepředstavuje styl bez bodů.
Viz také
- Kombinační logika
- Spojovací programovací jazyk
- Programování na úrovni funkcí
- Joy (programovací jazyk) , moderní vysoce tichý jazyk
- Bezúčelná topologie
Reference
externí odkazy
- Pure Functions in APL and J How to use tacit programming in any APL-like language
- Uzavřené aplikační jazyky 1971 - 1976 a další , v John W. Backus (publikace)