visual tutorial sharp que programacion lenguaje historia definicion curso caracteristicas c# functional-programming

tutorial - ¿Por qué C#es un lenguaje de programación funcional?



que es c sharp (8)

Al no haber una definición rigurosa de "OO Language", "Functional Language", "Procedural Language", se puede argumentar que cualquier idioma se adapta principalmente a cualquier clasificación; uno puede escribir Java procedimental, C orientado a objetos y C ++ funcional. Por lo general, utilizo una clasificación basada en lo que las principales características semánticas admiten, junto con la práctica de desarrollo común. Una buena forma de ver esto es examinar los marcos integrados y populares, y ver qué estilo usan.

Los lenguajes funcionales se definen principalmente como aquellos con primitivas de función de primera clase, con estilos de desarrollo que los usan para reducir la complejidad con modismos como "mapa". Otra característica común es la coincidencia de patrones, pero no veo esto como exclusivamente funcional. Los lenguajes funcionales "puros" tampoco tienen efectos secundarios, pero eso no es obligatorio (¿qué tan confusos son estos conceptos? :).

Entonces, ¿qué es C #? Bueno, tiene primitivas de estilo de función de primera clase, con delegados (y ha ganado un mejor soporte sintáctico para el estilo con delegados anónimos y lambdas). ¿Esto lo hace funcional? Quizás, si uno escribe en un estilo funcional. ¿El Marco usa este estilo? No en realidad no.

Como tal, no clasificaría a C # como funcional en discusión general; es, en el mejor de los casos, multi-paradigma, con cierto sabor funcional.

Se ha dicho que C # puede considerarse como un lenguaje de programación funcional, a pesar de que es ampliamente reconocido como un lenguaje de programación OO.

Entonces, ¿qué conjunto de características hace que C # sea un lenguaje de programación funcional?

Solo puedo pensar en:

  1. delegados (incluso sin métodos anónimos y expresiones lambda)
  2. cierres

¿Algo más?


Bueno, los delegados y los cierres le permiten operar de una manera funcional en gran medida ... por ejemplo:

var sum = data.Sum(x=>x.SomeProp);

etc

Puede escribir la mayoría de las funciones de orden superior utilizando lambdas / delegados. La inferencia de tipo no es lo mismo que los lenguajes funcionales puros como F #, pero la inferencia de tipo genérico de C # sigue siendo bastante buena (especialmente en C # 3.0).

Esto es especialmente cierto en .NET 3.5 y C # 3.0, donde LINQ adopta un enfoque altamente funcional para muchos de los problemas. Pero aún puede usar los aspectos funcionales de C # con .NET 2.0 y C # 2.0. Es más fácil con C # 3.0 y lambdas ;-p

En realidad, C # es un lenguaje de programación pragmático . Su objetivo es posibilitar el uso de una serie de paradigmas, sin castigarlo horriblemente si quiere hacer algo diferente.


C # ha tomado prestadas muchas características de ML y Haskell, por ejemplo:

  • C # 2.0 nos trajo el polimorfismo paramétrico (o "genéricos"). Escuché que Dom Syme, uno de los creadores de F #, fue el principal responsable de la implementación de genéricos en .NET BCL.

  • C # 2.0 también permite a los programadores pasar y devolver funciones como valores para funciones de orden superior, y tiene soporte limitado para delegados anónimos.

  • C # 3.0 y 3.5 mejoraron las funciones anónimas de soporte para cierres verdaderos.

  • LINQ se puede considerar el propio sabor de C # de las comprensiones de la lista.

  • Los tipos anónimos parecen una aproximación de los registros de ML

  • La inferencia de tipo es un hecho.

  • No sé ustedes, pero los métodos de extensión C # se parecen muchísimo a las clases de tipo Haskell.

  • Se ha hablado mucho sobre la palabra clave "dinámica" en C # 4.0. No estoy 100% seguro de los detalles de su implementación, pero estoy bastante seguro de que va a usar el tipado estructural en lugar del enlace tardío para retener la seguridad del tiempo de compilación de C #. La tipificación estructural es más o menos equivalente a "escribir patos para idiomas estáticos", es una característica que los hackers de Haskell y ML han estado disfrutando durante años.

Esto no quiere decir que C # es un lenguaje de programación funcional. Aún le faltan características importantes como la coincidencia de patrones, la optimización de la cola de llamadas y los literales de lista y tupla. Además, el C # idiomático es fundamentalmente imperativo con una gran dependencia del estado mutable.

No necesariamente consideraría algunas de las características mencionadas anteriormente como exclusivas de los lenguajes de programación funcionales, pero es bastante claro que los desarrolladores de C # se han inspirado mucho con los lenguajes de programación funcionales en los últimos años.


C # tiene algunas funciones de lenguaje funcional, cierres, por ejemplo. Las bibliotecas .NET no están escritas en un estilo funcional, por lo que en la práctica C # no es un lenguaje funcional. Casi todo se logra con la mutación. Los tipos de colección son todos mutables.


En general, estoy de acuerdo con los otros aquí que dicen que C # se describe mejor como multi-paradigma que funcional. Pero agregaría los ejemplos de características funcionales en C # LINQ, un sistema de primera clase y relativamente comprensible para escribir mónadas. Si bien los lenguajes puramente funcionales no requieren el uso de mónadas, el ejemplo de Haskell ha demostrado que pueden ser extremadamente útiles. Sin embargo, son una de las cosas más difíciles de comprender para muchas personas nuevas en Haskell. En C #, por otro lado, muchas personas escriben consultas LINQ en estos días sin siquiera darse cuenta de que están escribiendo mónadas.


Los punteros de función son otra característica que C # tiene en la categoría funcional.

Sin embargo, no creo que C # sea ampliamente considerado como un lenguaje funcional. Creo que es importante señalar que se puede programar en un estilo funcional en muchos idiomas que no son puramente funcionales.

De la programación funcional :

En informática, la programación funcional es un paradigma de programación que trata la computación como la evaluación de las funciones matemáticas y evita los datos de estado y mutables. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado.

Usando esa definición, puede programar en un estilo funcional en casi cualquier lenguaje de procedimiento. Los lenguajes puramente funcionales solo lo hacen cumplir.


Estos son los puntos principales que hacen c # funcional 1-Lamba expressions 2-Extension methods 3-Type inferende 4-Object y collection initializers 5-Closures 6-Anonymous types 7-Linq