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) . glze 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 0j1krá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é

Reference

externí odkazy