Pregunta

Una de las características principales de la programación funcional es el uso de funciones secundarias sin efecto. Sin embargo, esto también se puede hacer en un idioma 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.

¿Fue útil?

Solución

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 elementos prestados de lenguajes de programación funcionales, pero simplemente tener lambdas o funciones transparentes referencialmente no hacen que un lenguaje imperativo sea funcional; La programación funcional es más que solo estos elementos.

Otros consejos

Realmente no puedo decir si son subconjuntos el uno del otro. Sin embargo, lo que puedo decir que (excepto los idiomas realmente esotéricos) son todos Turing-COMPLETO, lo que significa que al final todos son igualmente poderosos, pero no necesariamente igualmente expresivos.

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

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 se debe considerar imperativo un subconjunto de funcional?

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 no está diseñado para este propósito.

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 haberlo aprendido bien, aunque no use estos idiomas regularmente, puede comenzar a usar esos principios en el Lenguaje diario que usa regularmente.

A algunas personas les gustaría buscar en Google Programación orientada a objetos en C

La mayoría de los idiomas imperativos no tienen funciones como tipos de primer orden, mientras que la mayoría de las funciones o. (Al igual que C ++, a través de la función Boost ::).

Por tipo de primer orden, este valor de medición/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 se completan.

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

Creo que podría ser útil dibujar una distinción entre paradigma y idioma.

A mi, paradigmas representar "maneras de pensar" (conceptos y abstracciones como funciones, objetos, recursión), mientras que lengua oferta "Formas de hacer" (Sintaxis, variables, evaluaciones).

Todo cierto Los lenguajes de programación son equivalentes en el sentido de que están Turing-COMPLETO y capaz, en teoría, de calcular cualquier función computable de turing, así como simular o simularse por una máquina de turing universal.

Lo interesante es lo difícil que es lograr ciertas tareas en ciertos idiomas o paradigmas, cuán apropiada es la herramienta para la tarea. Incluso el juego de la vida de Conway es completamente completo, pero eso no me hace querer programar con ella.

Muchos idiomas admiten una serie de paradigmas. C ++ fue diseñado como una extensión orientada a objetos para C, pero es posible escribir un código puramente de procedimiento en él.

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

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

Creo que no importa cuál de los términos, declarativos, imperativos, funcionales o de procedimiento, es un subconjunto de los cuales. Lo que más importa es comprender los lenguajes de las herramientas con los 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 te volverás.

Una forma de verlo (no decir que es la forma correcta, porque no soy un diseñador o teórico de Lang de ninguna manera) es que si El lenguaje se convierte esencialmente en otra cosa que '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 la máquina es imprescindible, puede tomar la posición de que, por lo tanto, todos los idiomas son imprescindibles, porque son solo abstracciones útiles para los humanos que luego son hirvidos por el compilador al código de máquina de procedimiento e imperativo.

Pattern mapping like

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

is something that is for instance one thing that is not available in imperative languages. Also constructs like curried functions:

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

is not available in most imperative languages

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top