Hace mucho que no posteo sobre el amigo C# y la verdad es que estoy algo oxidado... Pero me intereso este articulo y se merecia un post.
El paradigma de programación funcional fue creado explícitamente para la resolución de problemas con enfoque matemático puro. La programación funcional es una forma de programación declarativa. En cambio, la mayoría de los lenguajes convencionales, incluidos los lenguajes de programación orientada a objetos (OOP) como C #, Visual Basic, C ++ y Java, fueron diseñados principalmente para soportar la programación imperativa (de procedimiento).
En la programación orientada a objetos tradicional (OOP), la mayoría de los desarrolladores están acostumbrados a la programación en el estilo imperativo / procedimental. Para cambiar al desarrollo en un estilo funcional puro, tienen que hacer una transición en su pensamiento y su acercamiento al desarrollo.
Para resolver problemas, los desarrolladores de OOP diseñan jerarquías de clases, se enfocan en la encapsulación apropiada y piensan en términos de contratos de clases. El comportamiento y el estado de los tipos de objetos son primordiales, y se proporcionan características del lenguaje, como clases, interfaces, herencia y polimorfismo, para abordar estas preocupaciones.
Por el contrario, la programación funcional aborda los problemas computacionales como un ejercicio de evaluación de las transformaciones funcionales puras de las colecciones de datos. La programación funcional evita los datos de estado y mutables, y en su lugar enfatiza la aplicación de funciones.
Afortunadamente, C # no requiere el salto completo a la programación funcional, ya que soporta los enfoques de programación tanto imperativos como funcionales. Un desarrollador puede elegir qué enfoque es el más apropiado para un escenario en particular. De hecho, los programas a menudo combinan ambos enfoques.
Dejo link:
https://msdn.microsoft.com/en-us/library/mt693186.aspx