round library clase c# math f#

library - root c# math



¿Es F#realmente mejor que C#para las matemáticas? (7)

A pesar de los lenguajes no administrados, ¿F # es realmente mejor que C # para implementar matemática? Y si ese es el caso, ¿por qué?


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

  1. F # te permite resolver problemas de una manera en que los matemáticos piensan en ellos
  2. Gracias a las funciones de orden superior, puede usar conceptos más simples 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 paralelizar)

Definitivamente es 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 siguiente punto de Marc Gravell no es una objeción válida:

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 cabecera / cola, pero podría ser solo yo.

Esto es, por supuesto, cierto. Sin embargo, lo mejor de F # es que puedes comenzar a escribir el programa usando tuplas y listas de cabecera / cola y más adelante 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 lenguajes fáciles de usar (por ejemplo, Python), que muchas personas usan 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 uso este estilo en mi libro de programación funcional .




F # tiene muchos beneficios enormes sobre C # en el contexto de los programas matemáticos:

  • Las sesiones interactivas F # le permiten ejecutar código sobre la marcha para obtener resultados de inmediato e incluso visualizarlos , sin tener que crear y ejecutar una aplicación completa.

  • F # admite algunas características que pueden proporcionar mejoras masivas de rendimiento en el contexto de las matemáticas. En particular, la combinación de funciones en inline y de orden superior permite que el código matemático se factorice elegantemente sin afectar negativamente el rendimiento. C # no puede expresar esto.

  • F # admite algunas características que hacen posible implementar conceptos matemáticos de forma mucho más natural que la 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.

  • Los 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, convertí una implementación de descomposición QR sobre System.Double desde 2kLOC of C #. El F # tenía solo 100 líneas de código, funciona más de 10 veces más rápido y se generaliza sobre el tipo de número, por lo que funciona no solo en float32 , float y System.Numerics.Complex sino que ¡incluso se puede aplicar a matrices simbólicas para obtener resultados simbólicos!

FWIW, escribo libros sobre este tema, así como software comercial.


No estoy seguro si es mejor o peor, pero ciertamente 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 tienes libros como this que dicen que Python 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.


Soy de origen matemático y he estudiado 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 cabecera / 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 para 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 .


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.