¿Cuál es su experiencia de aprendizaje automático en el mundo real en Haskell?

Con respecto al aprendizaje automático, Haskell no tiene bibliotecas con la madurez de, por ejemplo, SciKit Learn. Sin embargo, estos serán resueltos eventualmente. La esencia del aprendizaje automático es representar los datos de manera abstracta y manipularlos. Haskell es excelente en estas tareas. De hecho, al tener un sistema de tipos tan fuerte, Haskell puede evitar exactamente los tipos de errores difíciles de resolver que pueden ocurrir cuando todos sus datos son efectivamente vectores de números de coma flotante.

Ciertos componentes del aprendizaje automático también siguen un patrón que funciona extremadamente bien para Haskell. Toman algunos datos como entrada, realizan un procesamiento complejo y luego generan sus resultados. Cosas como IO y estado global pueden ser un poco torpes en Haskell, pero estos problemas de LD tienen límites de IO muy limitados, por lo que Haskell puede tratarlos bien al enfocarse en el procesamiento de datos.

Sin duda, hay problemas, aprendizaje automático o no. Haskell te obliga a planificar mejor. Si desea que su programa registre cierta salida en ciertos puntos, debe prepararse para eso y planificar con anticipación, o de lo contrario enfrentará una refactorización bastante molesta. Agregar otro conjunto de elementos al esquema de su base de datos puede causar dolores de cabeza y aumentar extravagantemente los tiempos de compilación si está utilizando una biblioteca de Template Haskell como Persistent. Pero este tipo de problemas puede ocurrir en cualquier idioma. Si está resolviendo el problema de inicio de sesión lanzando aleatoriamente llamadas de inicio de sesión porque su idioma permite efectos secundarios arbitrarios, su código probablemente no sea muy bueno.

Pero, en general, estoy bastante satisfecho con Haskell para mis proyectos en el mundo real.

Mi experiencia es vieja

Aprendí Haskell cuando pasé por la universidad (mediados de los 90). Lo disfruté, pero nunca esperé volver a verlo. Lo probé en algunos proyectos en la escuela de posgrado, pero siempre me resultó demasiado difícil de depurar.

Disfruté de la FP, pero encontré que la FP pura era demasiado dolorosa para el desarrollo. Por ejemplo, en LISP, puede usar let * para hacer un trabajo y luego imprimir el resultado en la consola. Había una función similar en un lenguaje llamado Clean. Sin embargo, Haskell detectaría que el resultado de la declaración impresa no se usó, así que nunca lo llame. Está bien si mi programa funcionó, pero un dolor correcto para encontrar dónde estaba mal.

Después de mi postdoctorado, decidí ingresar a la industria en lugar de continuar en la academia. Estaba trabajando en un problema de coincidencia estocástica razonablemente complejo, aunque dependiendo de su definición de ML podría no calificar. Realicé pruebas de precisión / recuperación y ajusté manualmente los pesos en el código en lugar de aprender automáticamente.

De todos modos, un subsistema significativo fue el generador de opciones. Eso produce la cola de prioridad que luego repito. Para mi sorpresa absoluta, fue escrito en Haskell. En general, me pareció casi un desastre. Seguí encontrando escenarios que no generó y:

  1. Mi Haskell estaba oxidado después de 10 años y no quería volver a aprenderlo por completo. Esto hizo que la corrección de errores fuera aún más molesta de lo que sería
  2. Habíamos utilizado la evaluación perezosa de Haskell para implementar la mejor búsqueda primero. A medida que permitimos más opciones, descubrí que la pila del programa se volvió loca. Quería implementar cosas como la poda, pero eso significaba descartar la mayor parte de la evaluación perezosa, por eso elegimos a Haskell en primer lugar

En general fue bastante molesto. Llegué allí, pero más lento que si dijera que se había utilizado Python. En términos de los puntos que mencionas:

[Sistema de tipos]. No afectó las cosas de ninguna manera.

[Bibliotecas]. No más ni menos que otros idiomas.

[Estabilidad]. No estoy seguro de estar de acuerdo aquí. Necesitaba pensar mucho más en GC que en otros idiomas.

[Flexibilidad]. De nuevo, no estoy seguro de estar de acuerdo. Diseñamos cosas inicialmente para hacer un uso intensivo de la evaluación perezosa y cuando esto no funcionó fue extremadamente difícil rediseñar el programa para que yo administre la pila.

[Pura PF]. Sin opinión, solo quería hacer un trabajo para poder facturar al cliente. Creo que FP significa que una vez que algo comienza a funcionar, sigue funcionando, pero ese es un punto relativamente menor, ya que puedo lograr lo mismo con las pruebas unitarias.

[Aplicabilidad de FP al procesamiento de datos]. No encontré que las consultas de bases de datos de Haskell fueran especialmente buenas.

En general, fue un poco complicado, más o menos comparable a encontrarlo escrito en C y tendría que escribir yo mismo la manipulación de la cadena. No sé si las cosas han mejorado en los últimos diez años.