A pesar de los idiomas no administrados, ¿F # es realmente mejor que C# para implementar matemática? Y si ese es el caso, ¿por qué?¿Es F # realmente mejor que C# para las matemáticas?
Respuesta
Creo que la mayoría de los puntos importantes que ya fueron mencionados por otra persona:
- F # le permite resolver problemas de una manera matemáticos piensan acerca de ellos
- Gracias a funciones de orden superior, puede utilizar más sencillo conceptos para resolver problemas difíciles
- 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.
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.
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. –
> nada puede vencer C - ¿Puedes probarlo? –
@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
Este post parece que podría ser relevante: http://fsharpnews.blogspot.com/2007/05/ffts-again.html
también: C#/F# Performance comparison
La mayor ventaja para las matemáticas pura es lo que dijo PerpetualCoder, F # se parece más a un problema de matemáticas, así que va a ser más fácil para un matemático para escribir. Me recordó mucho a MATLAB cuando lo miré.
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.
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.
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 –
F # admite units of measure, que puede ser muy útil para el trabajo de matemáticas.
¡Es un salvavidas para todo lo relacionado con la física! – Benjol
@Benjol esta característica me ha ayudado mucho en el desarrollo de juegos.
@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
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.
problemasmatemá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.
Wow, acabo de ver tu libro. Pero GPB125 ... tío, estás valorando seriamente a mucha gente. –
@Dmitri: Sí, solo vale la pena si tiene la intención de ganar mucho dinero escribiendo el código F #. :-) –
Espere un momento ... I * do * indend para ganar mucho dinero escribiendo el código F #. :) ¿Hay un capítulo de muestra o algo así? –
- 1. ¿Realmente SplFixedArray funciona mejor que las matrices?
- 2. ¿Cómo se hacen las matemáticas (o matemáticas) con números mayores que MaxValue en C#?
- 3. Optimización de código F # o es realmente tan lenta?
- 4. C: enum VS #define para constantes matemáticas?
- 5. Functor es para (a -> b) -> (f a -> f b), ¿qué es para (Categoría c) => c a b -> c (f a) (f b)?
- 6. El mejor enfoque para diseñar bibliotecas F # para utilizar desde F # y C#
- 7. Matemáticas enteras en C#
- 8. Girar imagen matemáticas (C#)
- 9. ¿Buena biblioteca para matemáticas 3D en C#?
- 10. break; C++: bucle que es lo que realmente romper
- 11. Mejor enfoque para programar reglas empresariales/matemáticas altamente complejas
- 12. C++ ¿Es privado realmente privado?
- 13. CLR de F # y C# es lo mismo que por qué F # es más rápido que C#
- 14. Quiero mejorar las habilidades matemáticas para programar
- 15. ¿Es F # realmente más rápido que Erlang en los procesos de desove y muerte?
- 16. ¿Cuál es la mejor forma de ejecutar expresiones matemáticas?
- 17. ¿Es realmente la mejor práctica preferir las referencias de C++ a los punteros en todas las situaciones?
- 18. XEmacs vs Emacs que es mejor para programar C++
- 19. ¿Es asincrónico en C# la misma implementación que en F #?
- 20. Biblioteca funcionadora C++ para evaluar expresiones matemáticas/aritméticas
- 21. ¿Se pueden acortar las referencias matemáticas en C#?
- 22. ¿Cuál es la mejor manera de documentar el código f #?
- 23. ¿SQLite es realmente más rápido que MySQL?
- 24. Intérprete personalizado para expresiones matemáticas
- 25. por qué "f = f ++" no es seguro en c?
- 26. Biblioteca de matemáticas para Java
- 27. ¿Doctrine realmente es tan lento que PDO?
- 28. ¿Hay alguna herramienta que admita matemáticas discretas?
- 29. Lo que realmente es 2-legged Oauth
- 30. C# Matemáticas cuestión de clase
@ 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. –
@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). –