Muchas de las otras respuestas se han centrado en el lado del rendimiento (paralelismo) de la programación funcional, que creo que es muy importante. Sin embargo, usted específicamente preguntó acerca de la productividad, como en, ¿puede programar lo mismo más rápido en un paradigma funcional que en un paradigma imperativo.
Encuentro (por experiencia personal) que la programación en F # coincide con la forma en que pienso mejor, y por eso es más fácil. Creo que esa es la mayor diferencia. He programado tanto en F # como en C#, y hay mucho menos "pelear el idioma" en F #, lo cual me encanta. No tiene que pensar en los detalles en F #. Aquí hay algunos ejemplos de lo que descubrí que realmente disfruto.
Por ejemplo, aunque F # está tipado estáticamente (todos los tipos se resuelven en tiempo de compilación), la inferencia tipo determina qué tipos tiene, por lo que no tiene que decirlo. Y si no puede resolverlo, automáticamente hace que su función/clase/lo que sea sea genérica. Entonces nunca tienes que escribir ningún genérico, es automático. Encuentro que eso significa que paso más tiempo pensando en el problema y menos cómo implementarlo. De hecho, cada vez que vuelvo a C#, descubro que realmente extraño esta inferencia de tipo, nunca te das cuenta de lo distraída que es hasta que ya no necesites hacerlo.
También en F #, en lugar de escribir bucles, llama a funciones. Es un cambio sutil, pero significativo, porque ya no tienes que pensar en la construcción del lazo. Por ejemplo, aquí hay un trozo de código que ir a través y que coincida con algo (no puedo recordar lo que, es de un proyecto Euler rompecabezas):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome/x))
Soy consciente de que haciendo un filtro a continuación, un mapa (que es una conversión de cada elemento) en C# sería bastante simple, pero debes pensar en un nivel inferior. Particularmente, tendría que escribir el bucle en sí mismo, y tener su propia declaración explícita si, y ese tipo de cosas. Desde que aprendí F #, me di cuenta de que me resulta más fácil codificar de forma funcional, donde si quieres filtrar, escribes "filter", y si quieres hacer un mapa, escribes "map", en lugar de implementar cada uno de los detalles.
También me gusta el operador |>, que creo que separa F # de ocaml, y posiblemente otros lenguajes funcionales. Es el operador de tuberías, te permite "conectar" la salida de una expresión a la entrada de otra expresión. Hace que el código siga cómo pienso más. Como en el fragmento de código anterior, eso significa: "tomar la secuencia de factores, filtrarla y luego asignarla". Es un nivel muy alto de pensamiento, que no se obtiene en un lenguaje de programación imperativo porque estás tan ocupado escribiendo las instrucciones loop y if. Es lo que más extraño cuando entro a otro idioma.
Por lo general, aunque puedo programar en C# y F #, me resulta más fácil usar F # porque se puede pensar en un nivel superior. Yo diría que debido a que los detalles más pequeños se eliminan de la programación funcional (al menos en F #), soy más productivo.
Editar: Vi en uno de los comentarios que solicitó un ejemplo de "estado" en un lenguaje de programación funcional.F # puede escribirse obligatoriamente, por lo que aquí es un ejemplo directo de cómo se puede tener estado mutable en Fa #:
let mutable x = 5
for i in 1..10 do
x <- x + i
¡Bien dicho y al punto! –
¡En segundo lugar! Creo que la programación funcional se usará mucho más ampliamente en el futuro debido a su idoneidad para la programación paralela. –
@Ray: ¡También agregaría programación distribuida! –