2008-12-18 11 views

Respuesta

32

Creo que la mayoría de los puntos importantes que ya fueron mencionados por otra persona:

  1. F # le permite resolver problemas de una manera matemáticos piensan acerca de ellos
  2. Gracias a funciones de orden superior, puede utilizar más sencillo conceptos para resolver problemas difíciles
  3. Todo es inmutable por defecto, lo que hace que el programa sea más fácil de entender (y también más fácil de poner en paralelo)

se es definitivamente cierto que puede usar algunos de los conceptos de F # en C# 3.0, pero existen limitaciones. No puede usar ningún cálculo recursivo (porque C# no tiene recursión de cola) y así es como se escriben los cálculos primitivos de manera funcional/matemática. Además, escribir funciones complejas de orden superior (que toman otras funciones como argumentos) en C# es difícil, porque tienes que escribir tipos explícitamente (mientras que en F #, los tipos se deducen, pero también se generalizan automáticamente, por lo que no tienes que hacer explícitamente una función genérica).

Además, creo que el punto de Marc Gravell siguientes no es una objeción válida:

Desde un ángulo de mantenimiento, soy de la opinión de que las propiedades de nombre adecuado, etc son más fáciles de usar (más completa ciclo de vida) que las tuplas y las listas de cabeza/cola, pero podría ser solo yo.

Esto es cierto, por supuesto. Sin embargo, lo mejor de F # es que puedes comenzar a escribir el programa usando las listas de tuplas & head/tail y luego en el proceso de desarrollo convertirlo en un programa que usa .NET IEnumerables y tipos con propiedades (y así es como creo F típico el programador funciona *). Las herramientas de desarrollo interactivo Tuples, etc. y F # le brindan una excelente manera de prototipar rápidamente las soluciones (y al hacer algo matemático, esto es esencial porque la mayor parte del desarrollo es solo experimentar cuando se busca la mejor solución). Una vez que tenga el prototipo, puede usar transformaciones de código fuente simples para envolver el código en un tipo F # (que también se puede usar desde C# como una clase ordinaria). F # también le ofrece muchas maneras de optimizar el código más adelante en términos de rendimiento.

Esto le da los beneficios de la fácil de usar langauges (por ejemplo Python), que muchas personas utilizan para la fase de creación de prototipos. Sin embargo, no es necesario volver a escribir todo el programa una vez que haya terminado con la creación de prototipos utilizando un lenguaje eficiente (por ejemplo, C++ o C#), porque F # es "fácil de usar" y "eficiente" y puede cambiar con fluidez entre estos dos estilos.

(*) También utilizo este estilo en mi functional programming book.

+0

@ T.P .: Tengo curiosidad acerca de la recursividad de cola (que no se encuentra en C#, como sabemos). ¿Es realmente un gran problema en los escenarios del mundo real? Creo que es solo una cuestión de optimización. Además, me gustaría saber si todavía crees que es un problema usar funciones de orden superior hoy en día cuando tenemos lambdas en C#. Yo uso lambdas muy a menudo. –

+0

@Al Kepp: cuanto más se escribe el programa de una manera funcional, más se tiende a usar la recursión y más se necesita recurrencia de la cola. Por lo tanto, puede escribir C# "funcional", pero cuando procese estructuras recursivas o escriba funciones recursivas, deberá escribirlas de manera imperativa para obtener la misma eficacia que en F #. Sin embargo, las lambdas funcionan bien sin recurrencia de cola (hasta que quieras utilizar trucos avanzados como el estilo de continuación de paso). –

1

No estoy seguro de si es mejor o peor, pero sin duda hay una diferencia en el enfoque. Los lenguajes estáticos sobre especifican cómo se resolverá un problema. Los lenguajes funcionales como F # o Haskell no hacen eso y están más adaptados a cómo un matemático resolvería un problema en particular. Entonces usted tiene libros como this que tout pitón es bueno en eso. Si estás hablando desde el punto de vista del rendimiento, nada puede vencer a C. Si hablas desde bibliotecas, creo funcional Langauges (F # y similares), Fortan (sí, aún no está muerta), Python tiene excelentes bibliotecas para matemáticas.

+1

F # es también un lenguaje estáticamente tipado, solo tiene una inferencia de tipo excelente y otras capacidades que le permiten especificar el problema de una manera ligera. –

+0

> nada puede vencer C - ¿Puedes probarlo? –

+0

@SargeBorsch: No necesito probarlo. No quise decir que si escribes crap C code, será rápido. Está cerrado al h/w entre los idiomas que mencioné. – Perpetualcoder

7

Soy de formación matemática, y he mirado F #, pero aún prefiero C# para la mayoría de los propósitos. Hay un par de cosas que F # hace más fácil, pero en general todavía prefiero C# por un amplio margen.

Algunos de los beneficios promocionados de F # (inmutabilidad, funciones de orden superior, etc.) aún se pueden hacer en C# (utilizando delegados, etc. para este último). Esto es aún más evidente cuando se utiliza C# 3.0 con soporte lambda, lo que hace que sea muy fácil y expresivo declarar código funcional.

Desde un punto de vista de mantenimiento, soy de la opinión de que las propiedades convenientemente nombradas, etc. son más fáciles de usar (durante el ciclo de vida completo) que las tuplas y las listas de cabeza/cola, pero podría ser solo yo.

Una de las áreas donde C# se deja para las matemáticas es en genéricos y su apoyo a los operadores. Así que dedico un poco de tiempo a abordar esto ;-p Mis resultados están disponibles en MiscUtil, con información general here.

-3

Una de las grandes ventajas de los lenguajes funcionales es el hecho de que pueden ejecutarse en sistemas multiprocesador o multi-core, en paralelo sin necesidad de cambiar ningún código. Eso significa que puede acelerar sus algoritmos simplemente agregando núcleos.

+2

Bueno, eso se aplica al * código * funcional, no solo a los * idiomas * funcionales. Ver Extensiones Paralelas para hacer * exactamente * esto en C#. Las extensiones paralelas (IIRC) se atornillarán en .NET 4.0 –

13

F # admite units of measure, que puede ser muy útil para el trabajo de matemáticas.

+3

¡Es un salvavidas para todo lo relacionado con la física! – Benjol

+1

@Benjol esta característica me ha ayudado mucho en el desarrollo de juegos. ... time, networking (bytes, paquetes, etc.). Lo que me encanta de las unidades de medida es que me permite nombrar mis variables para lo que se utilizan y no preocuparme por lo que contienen. p.ej. 'let damage = 5 , 10 ' en lugar de 'let hpDamage, shieldDamage = 5, 10' – gradbot

+0

@gradbot, me sirve porque los datos a menudo vienen en una mezcla de mm/m/km, y la representación interna es (se supone que es, al menos) todo en m, antes de volver a salir en varios formatos. ¿Podría UoM ser el antídoto para la notación húngara? :) – Benjol

18

F # tiene muchas ventajas enormes sobre C# en el contexto de los programas de matemáticas:

  • F # sesiones interactivas permiten ejecutar código en la marcha para obtener resultados inmediatamente y even visualize them, sin tener que construir y ejecutar una aplicación completa.

  • F # soporta algunas características que pueden proporcionar grandes mejoras de rendimiento en el contexto de las matemáticas. Lo más notable es que la combinación de inline y las funciones de orden superior permiten que el código matemático se factorice elegantemente sin afectar negativamente al rendimiento. C# no puede expresar esto.

  • F # es compatible con algunas de las características que hacen que sea posible la aplicación de los conceptos matemáticos mucho más natural que se puede obtener en C#. Por ejemplo, las llamadas finales hacen que sea mucho más fácil implementar relaciones de recurrencia de manera simple y confiable. C# no puede expresar esto tampoco.

    problemas
  • matemáticos a menudo requieren el uso de estructuras de datos y algoritmos más sofisticados. Expresar soluciones complicadas es mucho más fácil con F # en comparación con C#.

Si desea un estudio de caso, que convierte una implementación de descomposición QR sobre System.Double de 2kLOC de C#. El F # solo tenía 100 líneas de código, funciona más de 10 × más rápido y se generaliza sobre el tipo de número, por lo que no solo funciona en float32, float y System.Numerics.Complex, ¡sino que también se puede aplicar a matrices simbólicas para obtener resultados simbólicos!

FWIW, I write books sobre este tema, así como software comercial.

+2

Wow, acabo de ver tu libro. Pero GPB125 ... tío, estás valorando seriamente a mucha gente. –

+2

@Dmitri: Sí, solo vale la pena si tiene la intención de ganar mucho dinero escribiendo el código F #. :-) –

+2

Espere un momento ... I * do * indend para ganar mucho dinero escribiendo el código F #. :) ¿Hay un capítulo de muestra o algo así? –

Cuestiones relacionadas