La programación tácita , también llamada estilo sin puntos , es un paradigma de programación en el que las definiciones de funciones no identifican los argumentos (o "puntos") sobre los que operan. En cambio, las definiciones simplemente componen otras funciones, entre las que se encuentran los combinadores que manipulan los argumentos. La programación tácita es de interés teórico, porque el uso estricto de la composición da como resultado programas bien adaptados para el razonamiento ecuacional . [1] También es el estilo natural de ciertos lenguajes de programación , incluido APL y sus derivados, [2] ylenguajes concatenativos como Forth . La falta de denominación de argumentos le da al estilo sin puntos una reputación de ser innecesariamente oscuro, de ahí el epíteto "estilo sin sentido". [1]
Las secuencias de comandos de Unix utilizan el paradigma con tuberías .
La idea clave en la programación tácita es ayudar a operar al nivel apropiado de abstracción.
Ejemplos de
Pitón
La programación tácita se puede ilustrar con el siguiente código Python . Una secuencia de operaciones como la siguiente:
def ejemplo ( x ): y = foo ( x ) z = bar ( y ) w = baz ( z ) return w
... está escrito en estilo libre de puntos como la composición de una secuencia de funciones, sin parámetros: [3]
de functools importar parcial , reducir def compose ( * fns ): devolver parcial ( reducir , lambda v , fn : fn ( v ), fns )ejemplo = componer ( baz , bar , foo )
Para un ejemplo más complejo, el código Haskell p = ((.) f) . g
se puede traducir como:
p = parcial ( componer , parcial ( componer , f ), g )
Programación funcional
Un ejemplo simple (en Haskell ) es un programa que calcula la suma de una lista de números. Podemos definir la función de suma de forma recursiva usando un estilo puntiagudo (cf. programación de nivel de valor ) como:
suma ( x : xs ) = x + suma xs suma [] = 0
Sin embargo, usando un pliegue podemos reemplazarlo con:
suma xs = foldr ( + ) 0 xs
Y luego el argumento no es necesario, por lo que esto se simplifica a
suma = foldr ( + ) 0
que está libre de puntos.
Otro ejemplo usa la composición de funciones :
p x y z = f ( g x y ) z
El siguiente pseudocódigo similar a Haskell expone cómo reducir la definición de una función a su equivalente sin puntos:
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 ) ( * Aquí el operador de composición infijo "." se usa como una función al curry . * ) = \ x -> (( . ) f ) ( g x ) = \ x -> (((( . ) f ) . g ) x p = (( . ) f ) . gramo
Finalmente, para ver un ejemplo complejo, imagine un programa de filtro de mapa que toma una lista, le aplica una función y luego filtra los elementos según un criterio.
lista de operadores de criterios mf = criterios de filtro ( lista de operadores de mapa )
Puede expresarse sin puntos [4] como
mf = ( . mapa ) . ( . ) . filtrar
Tenga en cuenta que, como se indicó anteriormente, los puntos en 'sin puntos' se refieren a los argumentos, no al uso de puntos; un error común. [5]
Se han escrito algunos programas para convertir automáticamente una expresión de Haskell en una forma sin puntos.
Familia APL
En J , el mismo tipo de código sin puntos ocurre en una función creada para calcular el promedio de una lista (matriz) de números:
avg =: + / % #
+/
suma los elementos de la matriz mapeando ( /
) summation ( +
) a la matriz. %
divide la suma por el número de elementos ( #
) en la matriz.
La fórmula de Euler expresada tácitamente:
cos =: 2 o . ] pecado =: 1 o . ] Euler =: ^ @ j . = cos j . pecado
( j.
es una función primitiva cuya definición monádica es 0j1
multiplicada por x y cuya definición diádica es x+0j1×y
.) Los mismos cálculos tácitos expresados en Dyalog APL :
promedio ← + ⌿ ÷ ≢cos ← 2 ○ ⊢ sin ← 1 ○ ⊢ j ← { ⍺ ← 0 ⋄ ⍺ + 0j1 × ⍵ } ⍝ esta parte no es tácita Euler ← * ∘ j = cos j sin
Basado en pila
En los lenguajes de programación orientados a pilas (y los concatenativos , la mayoría de los cuales están basados en pilas [ cita requerida ] ), los métodos sin puntos se utilizan comúnmente. Por ejemplo, un procedimiento para calcular los números de Fibonacci podría tener el siguiente aspecto en PostScript :
/ fib { dup dup 1 eq exch 0 eq o no { dup 1 sub fib exch 2 sub fib add } if } def
Canalización de Unix
En las secuencias de comandos de Unix, las funciones son programas de computadora que reciben datos de la entrada estándar y envían los resultados a la salida estándar . Por ejemplo,
ordenar | uniq -c | sort -rn
es una composición tácita o sin puntos que devuelve los recuentos de sus argumentos y los argumentos, en orden decreciente. El 'sort' y 'uniq' son las funciones, el '-c' y '-rn' controlan las funciones, pero los argumentos no se mencionan. La pipa '|' es el operador de composición.
Debido a la forma en que funcionan las canalizaciones, normalmente solo es posible pasar un "argumento" a la vez en forma de un par de flujo de entrada / salida estándar. Aunque se pueden abrir descriptores de archivo adicionales desde canalizaciones con nombre , esto ya no constituye un estilo sin puntos.
Ver también
Referencias
- ^ a b Manuel Alcino Pereira da Cunha (2005) Cálculo del programa sin puntos
- ^ W. Neville Holmes, ed. (2006) Computadoras y personas
- ^ "Código de nombre, no valores" . Concatenative.org . Consultado el 13 de septiembre de 2013 .
- ^ pipermail
- ^ "Pointfree - HaskellWiki" . wiki.haskell.org . Consultado el 5 de junio de 2016 .
enlaces externos
- Funciones puras en APL y J Cómo utilizar la programación tácita en cualquier lenguaje similar a APL
- Lenguas aplicativas cerradas 1971-1976 y sigs. , En John W. Backus (Publicaciones)