He escrito una solicitud para equilibrar el cronograma nacional de generación de energía para una cartera de estaciones de energía a una posición comercial para una compañía de energía. Los componentes del cliente y el servidor estaban en C # pero el motor de cálculo estaba escrito en F #.
El uso de F # para abordar la complejidad en el corazón de esta aplicación demuestra claramente un punto óptimo para el lenguaje dentro del software empresarial, es decir, el análisis algorítmicamente complejo de grandes conjuntos de datos. Mi experiencia ha sido muy positiva. En particular:
Unidades de medida La industria en la que trabajo está llena de unidades. Las ecuaciones que implementé (a menudo de naturaleza geométrica) trataron con unidades de tiempo, potencia y energía. Hacer que el sistema de tipos verifique la exactitud de las unidades de las entradas y salidas de las funciones es un gran ahorro de tiempo, tanto en términos de prueba como de lectura / comprensión del código. Erradica toda una clase de errores a los que los sistemas anteriores eran propensos.
Programación exploratoria Trabajar con archivos de script y REPL (F # Interactive) me permitió explorar el espacio de la solución de manera más efectiva antes de comprometerme con una implementación que el ciclo tradicional de edición / compilación / ejecución / prueba. Es una forma muy natural para un programador desarrollar su comprensión del problema y las tensiones de diseño en juego.
Es un placer probar el código de prueba de unidad escrito con funciones de efectos no secundarios y estructuras de datos inmutables. No hay interacciones complejas dependientes del tiempo para arruinar las cosas o grandes conjuntos de dependencias para burlarse.
Interoperación Definí la interfaz para el motor de cálculo en C # e implementé el cálculo en F #. El motor de cálculo podría inyectarse en cualquier módulo C # que necesitara usarlo sin ninguna preocupación sobre la interoperabilidad. Sin costura. El programador de C # nunca necesita saberlo.
Reducción de código Gran parte de los datos introducidos en el motor de cálculo eran en forma de vectores y matrices. Las funciones de orden superior se comen en el desayuno con un mínimo de alboroto y un código mínimo. Hermoso.
Falta de errores La programación funcional puede parecer extraña. Puedo estar trabajando en un algoritmo, tratando de que el código pase el verificador de tipos, pero una vez que el verificador de tipos está satisfecho, funciona. Es casi binario, no compilará o es correcto. Los errores de casos extraños se minimizan, la recursividad y las funciones de orden superior eliminan una gran cantidad de código de contabilidad que introduce errores de casos extremos.
Paralelismo La pureza funcional de la implementación resultante lo hace maduro para explotar el paralelismo inherente en el procesamiento de vectores de datos. Tal vez aquí es donde iré ahora que .NET 4 está fuera.