8

Una de las principales características de la programación funcional es el uso de funciones sin efectos laterales. Sin embargo, esto también puede hacerse en un lenguaje imperativo. Lo mismo es cierto para las funciones de recursión y lambda (por ejemplo, C++ 0x). Por lo tanto, me pregunto si los lenguajes de programación imperativos son un superconjunto de los funcionales.¿La programación funcional es un subconjunto de la programación imperativa?

+1

pregunta interesante ...en la programación imperativa, tienes más formas de "ahorcarte", creo :-) – jldupont

+0

Estoy de acuerdo con tu forma de pensar en lo que se refiere a las "funciones sin efectos secundarios". Se puede escribir y usar una biblioteca de "funciones sin efectos laterales" en ambos paradigmas, mientras que los procedimientos imperativos con estado no se pueden usar en la programación funcional. – masterxilo

Respuesta

9

En general, no; la programación funcional es un subconjunto de programación declarativa (que incluye lenguajes de programación lógica, como Prolog). Muchos lenguajes imperativos toman prestados elementos de lenguajes de programación funcionales, pero el simple hecho de tener lambdas o funciones referencialmente transparentes no hace que un lenguaje imperativo sea funcional; la programación funcional es más que solo estos elementos.

+1

¿De verdad? He escrito programas en Prolog y algunas cosas relacionadas con SQL, y he escrito programas puramente funcionales. Los dos no parecían similares a mí. –

+1

Son similares en el sentido de que le está diciendo a la computadora * qué hacer (es decir, expresar la lógica de un cálculo) en lugar de * cómo * hacerlo; esa es la definición de programación declarativa. – mipadi

+0

Los lenguajes puramente funcionales son, pero como los lenguajes impuramente funcionales se superponen de nuevo en lugar de ser un subconjunto apropiado. – Zorf

4

Es posible implementar un cierto paradigma de programación en un lenguaje que no admite el paradigma de programación de forma nativa. Por ejemplo, es posible escribir código orientado a objetos en C, mientras que no está diseñado para este fin.

La programación funcional es un paradigma de programación bien desarrollado y se aprende mejor a través de lenguajes como Haskell, LISP, etc. Y después de haberlos aprendido bien, aunque no los use regularmente, puede comenzar a usarlos esos principios en el lenguaje cotidiano que usa regularmente.

Algunas personas pueden tener gusto de Google para Object oriented programming in C

+1

Lo que dices sobre C no tiene sentido, excepto en el más trivial que puedes tener un "objeto". ¿Cuál es el significado de OOP sin polimorfismo y herencia? – user44242

+2

puede implementar sus propios vtables en c si lo desea –

+0

Es ciertamente posible escribir código orientado a objetos en C; lo hicimos en un proyecto de fines de los '80, trabajando en OS/2 donde no había OO languages. Exigió un gran conjunto de macros (y un poco de locura) para implementar el polimorfismo y la herencia, pero funcionó. –

20

Realmente no puedo decir si son subconjunto de uno al otro. Lo que puedo decir, sin embargo, es que (a excepción de los lenguajes realmente esotéricos) son todos Turing-complete, lo que significa que al final todos son igualmente poderosos, pero no necesariamente igualmente expresivos.

+0

Así que es cierto ... Desearía tener más de un +1. – jldupont

+0

Stephen Wolfram diría "capaz de Universal Computation" o algo así. – jldupont

4

Un paradigma es una forma de hacer las cosas, y existen dos paradigmas de programación principales: imperativo y declarativo. El hecho de que algunos lenguajes permitan mezclar ambos paradigmas no significa que uno esté incluido en el otro, sino que los idiomas son multi-paradigma.

Para aclararlo un poco más, permítanme continuar con su analogía: si Lisp y OCaml (por ejemplo) se consideran lenguajes funcionales, y ambos permiten un estilo imperativo ... entonces debe considerarse un subconjunto de ¿funcional?

+0

Lisp (Common Lisp, específicamente) se conoce generalmente como un lenguaje multi-paradigma. Puede escribir código imperativo y funcional con relativa facilidad. – Vatine

+1

Lisp se conoce como multi-paradigma exactamente tanto como C++. Los puristas dirán que son multi-paradigmas (y tienen razón), pero en el uso común generalmente se los refiere como funcionales e imperativos/orientados a objetos respectivamente. De todos modos, mi punto era que si se pueden hacer ambos paradigmas, el lenguaje _es_ multi paradigma, por lo que la pregunta de la operación se declaró erróneamente desde el principio. – fortran

2

La mayoría de los idiomas imprescindibles no tienen funciones como tipos de primer orden, mientras que la mayoría de los funcionald o. (Al igual que C++, a través de boost :: function.)

Por tipo de primer orden, este valor un meas/variable puede ser de cualquier tipo, un int, un bool, una función de int-> bool. Por lo general, también incluye cierres o valores encuadernados, donde tiene la misma función, pero algunos argumentos ya están completados.

Esas dos son de lo que se trata principalmente la programación funcional, en mi humilde opinión.

1

mapeo Plan como

f:: [int] -> int 
f [] = 0 
f (x:xs) = 1 + f(xs) 

es algo que es, por ejemplo, una cosa que no está disponible en los lenguajes imperativos. también construye como funciones al curry:

add2 :: int -> int 
add2 = (2 +) 

no está disponible en los idiomas más imperativas

+0

El currying se puede hacer en C++ usando plantillas: http://stackoverflow.com/questions/152005/how-can-currying-be-done-in-c –

2

yo creo que puede ser útil para establecer una distinción entre paradigma y idioma.

Para mí, paradigmas representan "formas de pensamiento" (conceptos y abstracciones tales como funciones, objetos, recursividad), mientras que idiomas oferta "formas de hacer" (sintaxis, las variables, las evaluaciones) .

Todo esto es cierto lenguajes de programación son equivalentes en el sentido de que son Turing completo y capaz, en teoría, para calcular cualquier función de Turing-computable, así como simular o ser simulado por una máquina universal de Turing.

Lo interesante es lo difícil que es realizar ciertas tareas en ciertos lenguajes o paradigmas, qué tan apropiada es la herramienta para la tarea. Incluso el Juego de la vida de Conway es completo, pero eso no me hace querer programar con él.

Muchos idiomas admiten una serie de paradigmas. C++ se diseñó como una extensión orientada a objetos para C, pero es posible escribir código puramente procedimental en ella.

Algunos idiomas toman prestado/adquieren características de otros lenguajes o paradigmas a lo largo del tiempo (basta con observar la evolución de Java).

Algunos lenguajes, como Common Lisp, son impresionantes idiomas multi-paradigma. Es posible escribir código que sea funcional, orientado a objetos o de procedimiento en Lisp. Podría decirse que la orientación de aspecto ya es parte del sistema común de objetos de ceceo y, por lo tanto, "nada especial". En Lisp, es fácil extender el idioma en sí para hacer lo que sea necesario, por lo que a veces se lo denomina "lenguaje de programación programable". (Señalaré aquí que Lisp describe una familia de idiomas de los cuales Common Lisp es solo un dialecto).

Creo que no importa cuál de los términos, declarativo, imperativo, funcional o de procedimiento, es un subconjunto de los cuales. Lo que más importa es comprender los idiomas de las herramientas con las que está trabajando y cómo son diferentes de otras herramientas. Aún más importante es comprender las diferentes formas de pensar que representan los paradigmas, ya que esas son sus herramientas de pensamiento. Como con la mayoría de las otras cosas en la vida, cuanto más entiendes, más efectivo eres.

+0

"no importa cuál de los términos es un subconjunto de cuál ": Parte de la razón por la que pregunté esto fue porque me gustan algunos de los conceptos de programación funcional, pero no me gustan sus limitaciones, como la manera notoriamente difícil de tratar con E/S y el uso extensivo de la recursión . –

+0

¿Desde cuándo la recursión es una limitación? Los bucles y la recursividad son dos caras de la misma moneda, pero una es a menudo más apropiada que la otra. La programación funcional es un paradigma, el lenguaje específico (su sintaxis y sus bibliotecas) determina "qué tan difícil" es para cosas como E/S o bucles. Su uso de la palabra "notorio" sugeriría que no se ha cuidado bien. Por favor hazlo - Encontré que la E/S era bastante "difícil" de entender en Java 2, pero solo estaba usando los Javadocs para resolverlo. Elija un idioma que le parezca "amigable" y comience a leer sobre él. – Galghamon

1

Una forma de verlo (sin decir que es la manera correcta 'porque no soy un diseñador o teórico de lang de ninguna manera) es que si el lenguaje se convierte esencialmente en algo más que ese' algo más 'debe ser el superconjunto de la fuente. Entonces bytecode es necesariamente un superconjunto de Java. .NET IL es un superconjunto de C# y de F #. Las construcciones funcionales en C# (es decir, LINQ) son, por lo tanto, un subconjunto de las construcciones imperativas de IL.

Dado que el lenguaje de máquina es imperativo, puede tomar la posición de que, por lo tanto, todos los idiomas son imperativos, porque son solo abstracciones útiles para humanos que el compilador luego borra a código de máquina imperativo de procedimiento.

+0

+1 ¡Bonito comentario! Me gustaría votar, pero no funciona ("votar demasiado viejo para ser cambiado"). Lo siento :( –

Cuestiones relacionadas