Muchas de las otras respuestas se han centrado en el lado del rendimiento (paralelismo) de la programación funcional, lo que creo que es muy importante. Sin embargo, usted preguntó específicamente sobre la productividad, ya que en, ¿puede programar lo mismo más rápido en un paradigma funcional que en un paradigma imperativo?
De hecho, encuentro (por experiencia personal) que la programación en F # coincide con la forma en que pienso mejor, por lo que es más fácil. Creo que esa es la mayor diferencia. He programado tanto en F # como en C #, y hay mucho menos "lucha contra el lenguaje" en F #, que me encanta. No tiene que pensar en los detalles en F #. Aquí hay algunos ejemplos de lo que he encontrado que realmente disfruto.
Por ejemplo, aunque F # esté estáticamente tipado (todos los tipos se resuelven en tiempo de compilación), la inferencia de tipos determina qué tipos tiene, por lo que no tiene que decirlo. Y si no puede resolverlo, automáticamente convierte su función / clase / lo que sea genérico. Así que nunca tienes que escribir ningún genérico, todo es automático. Creo 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 #, encuentro que realmente extraño esta inferencia de tipo, nunca te das cuenta de lo molesto que es hasta que ya no tienes que hacerlo.
También en F #, en lugar de escribir bucles, se llaman funciones. Es un cambio sutil, pero significativo, porque ya no tienes que pensar en la construcción del bucle. Por ejemplo, aquí hay una pieza de código que pasaría y coincidiría con algo (no recuerdo qué, es de un proyecto de rompecabezas de Euler):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome / x))
Me doy cuenta de que hacer un filtro y luego un mapa (que es una conversión de cada elemento) en C # sería bastante simple, pero hay que pensar en un nivel inferior. En particular, tendrías que escribir el ciclo en sí y tener tu propia declaración if explícita, y ese tipo de cosas. Desde que aprendí F #, me di cuenta de que me resulta más fácil codificar de manera funcional, donde si quieres filtrar, escribes "filter", y si quieres mapear, escribes "map", en lugar de implementar Cada uno de los detalles.
También me encanta el operador |>, que creo que separa F # de ocaml, y posiblemente otros lenguajes funcionales. Es el operador de tubería, le permite "canalizar" la salida de una expresión en la entrada de otra expresión. Hace que el código siga cómo pienso más. Al igual que en el fragmento de código anterior, que dice: "tome la secuencia de factores, filtre y luego asigne". Es un nivel de pensamiento muy alto, que no se obtiene en un lenguaje de programación imperativo porque estás muy ocupado escribiendo el bucle y las declaraciones if. Es lo único que más extraño cada vez que voy a otro idioma.
Entonces, en general, aunque puedo programar en C # y F #, me resulta más fácil usar F # porque puedes 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 # se puede escribir imperativamente, así que aquí hay un ejemplo directo de cómo puede tener un estado mutable en F #:
let mutable x = 5
for i in 1..10 do
x <- x + i