
Una vez hablé con el fundador de una startup israelí que estaba desarrollando una base de datos de GPU de alta velocidad. Haskell y C ++ estaban en su pila, y el fundador se quejó de lo difícil que era encontrar personas en el equipo. Voló a Moscú, incluso para buscar buenos programadores.
Pregunté cuidadosamente si era mejor usar algo más común y nuevo. Y aunque la respuesta fue cortés y constructiva, entre líneas me pareció: "Pff, ni siquiera menciones estos juguetes".
Todo lo que escuché sobre Haskell desde un lado desde entonces se redujo a una cosa: "las bromas son malas con él". Para conocer mejor a los Haskellistas, vine al chat de telegramas para hacerles preguntas. Daba bastante miedo y resultó que no en vano.
No quieren hablar de Haskell popularmente, y parece que contemplan tales emprendimientos con desprecio. Ya hablando, con la máxima integridad y objetividad. “Una de las cualidades características de Haskell como idioma y comunidad es que juntos no se esforzaron por hacerse populares, dando una respuesta simple a las preguntas populares. En cambio, construyeron una forma lógica de principios para resolver problemas reales, en lugar de penetrar rápidamente en el corazón de un transeúnte por una persona interesada ”, me escribieron allí.
Sin embargo, varias personas compartieron sus experiencias, y reuní sus opiniones aquí.
Denis Mirzoev ( nolane ) : En la universidad, sobre el tema de "Lenguajes de programación", me ofrecieron tomar un curso en Haskell Coursera por un punto adicional de cada cien. Luego hubo un curso de programación funcional en el que tuvo lugar Haskell. Escribió un trabajo final y un trabajo de posgrado del soltero en GHC. Encontré un trabajo como programador Haskell.
Fue duro, y aún difícil. Cuando comienzas a estudiar Haskell, tienes que comprender muchos conceptos nuevos. Este es un trabajo duro. Literalmente aprendes a programar de nuevo.
Ahora será difícil para muchos recordar cómo comenzaron su viaje en la programación, lo difícil que fue comprender qué es un "puntero", qué es una "función", qué es una "clase". Quizás es por eso que estudiar Haskell es tan difícil. Con la edad, se hace más difícil aprender cosas nuevas.
Doctor_Ryner : Una vez en un período de prueba, caí en Redux, así que, mirando las lecciones de su creador, decidí conocer mejor a todos. Al principio apliqué las prácticas aprendidas en JavaScript, pero luego aprendí sobre Haskell, que se considera un verdadero lenguaje funcional. Inmediatamente me atrajo su elegancia y un montón de nuevos conceptos desconocidos para mí.
No fue fácil con infinitos tutoriales sobre mónadas sobre el ejemplo de los burritos, que son muy confusos. Además, un fondo imperativo dificulta la apertura de nuevos conceptos.
Yuri Syrovetsky ( cblp ) : lo más difícil de aprender es Haskell en segundo lugar, cuando el síndrome del patito no pasó al primer idioma.
¿Qué es bueno y qué es mal lenguaje?
Doctor_Ryner : El lenguaje es muy conciso, elegante y flexible, no en vano, la mitad de las bibliotecas en él son EDSL (al menos esa impresión).
Yuri Syrovetsky ( cblp ) : Alta expresividad, fácil de transferir el área temática al código, la combinación óptima de paradigmas imperativos y funcionales. Es fácil crear abstracciones en datos y algoritmos, lo que le permite pensar en el problema sin distraerse con pequeñas cosas no relacionadas.
John Doe : Mecanografía estrictamente fuerte (diría fascista).
Igor Shevnin ( interphx ) : un sistema de tipo muy expresivo. No es tan poderoso como Idris o Agda, pero alcanza ese punto medio cuando casi todo se puede expresar, y la inferencia de tipos funciona bien. No tiene que etiquetarlos manualmente en todas partes.
Pero un poderoso sistema de tipos te hace prestar atención a los valores pasados. Un montón de definiciones de tipo puede parecer una repetitiva. Cada equipo usa su propio conjunto de extensiones o no las usa en absoluto. El código es más "denso": una línea a menudo contiene más información que en otros idiomas, por lo que es más difícil para un desarrollador inexperto leerlo.
Doctor_Ryner : Cuando estudias a Haskell, lo más probable es que encuentres el dicho "si se compila, probablemente sea correcto". No hay nulo, el paradigma funcional en sí mismo es muy estricto y te obliga a seguir ciertas reglas, que en la mayoría de los casos conducen a un mejor diseño.
Por ejemplo, no hay variables en el lenguaje, solo constantes. No tiene que hacer un seguimiento de qué y dónde asigna. Haskell fomenta el uso de funciones puras, lo que no produce efectos secundarios. El diseño funcional simplemente hace que el programa funcione como un todo, a diferencia de OOP, donde un montón de objetos son arrojados al mundo y los objetos intentan comunicarse entre sí a través de efectos secundarios, convirtiendo la aplicación en un desastre impredecible. En el trabajo, sufrimos bastante de esto con C # en Unity.
Denis Mirzoev : La pereza incorporada aumenta la expresividad del lenguaje. Muchos algoritmos se están volviendo más fáciles. Puede aumentar la productividad si no se utilizan los resultados de los cálculos intermedios. (Por ejemplo, `head. Sort` funciona en tiempo lineal).
Igor Shevnin : un modelo de cálculo perezoso generalmente ayuda, pero cuando el orden de las funciones de llamada es importante, puede ser difícil darse cuenta de lo que está sucediendo.
Doctor_Ryner : Se compila, lo que inmediatamente da un gran aumento de velocidad.
Denis Mirzoev : Comparado con Java en velocidad, pero no tan rápido como C.
Igor Shevnin :
listo para usar , hay soporte para extensiones que le permiten terminar el idioma y el sistema de tipos. Sin embargo, hay muchas extensiones ampliamente utilizadas que son familiares para la comunidad, tienen ejemplos y documentación decentes, y no son nicho.
Doctor_Ryner : La biblioteca estándar Prelude tiene funciones muy pobres como read, head, readFile, que puede lanzar una excepción y ponerla en un programa, en lugar de devolver Quizás. Por lo tanto, debe usar alternativas o escribir sus propias implementaciones.
Igor Shevnin : El principal problema es la falta de estandarización, en la medida en que muchos reemplazan la biblioteca estándar con una de las alternativas incompatibles. Hay desacuerdos en la comunidad sobre qué debería ser una biblioteca estándar, qué debería incluirse en el núcleo del lenguaje y qué debería complementarse con extensiones, y me parece que esto ralentiza el desarrollo del lenguaje.
Denis Mirzoev : No hay suficientes herramientas: no hay un IDE completo, hay muy pocas herramientas para medir el rendimiento, no hay depuración "paso a paso", esto es, en general, un problema fundamental.
¿Para qué proyectos se adapta mejor Haskell?
Yuri Syrovetsky : Para tareas complejas relacionadas con la seguridad o el dinero, donde el costo del error es alto.
Doctor_Ryner : para todo lo que necesita para realizar cálculos, transformaciones y análisis de datos. Muy sorprendido de que Haskell sea menos popular en Data Science que Python.
Igor Shevnin : No me arriesgaría a usarlo para sistemas integrados (el rendimiento no es malo, pero todavía hay una sobrecarga significativa para el consumo de memoria debido a cálculos lentos) y pequeños scripts (este rigor simplemente no es necesario allí). También debe comprender que encontrar desarrolladores en un equipo es mucho más difícil que para los idiomas convencionales.
John Doe : Para escribir el código de la industria que otros leerán, necesitará un equipo completo de Haskellistas. Tales pocas personas lograron recolectar.
Igor Shevnin : Pero debido a su brevedad y rigor, Haskell es adecuado para casi cualquier tarea.
¿Comenzar a aprender desarrollo con Haskell es una buena idea?
Igor Shevnin: es poco probable que comience, porque la gran mayoría de las bases de código con las que una persona tendrá que trabajar no están escritas en él.
John Doe : ¡Mala, mala idea! Los idiomas que no sean de la familia ML, sino de los idiomas industriales en general, serán un shock para usted.
Denis Mirzoev : Por lo general, las personas primero estudian matemáticas, luego pasan a la programación. Por lo tanto, aprender un idioma usando conceptos matemáticos (tipos de datos algebraicos, funciones puras) debería ser más simple que imperativo. Es decir, creo que esta es una buena idea.
Doctor_Ryner : Todos los recién llegados que entreno, definitivamente te presentaré a Haskell. Las personas que no han estudiado el estilo imperativo son mucho más fáciles de navegar en el código funcional y aprenden más rápido, incluso si trabajan con lenguajes orientados a objetos, aportan buenas soluciones arquitectónicas y prácticas funcionales.
Yuri Syrovetsky : Es mejor comenzar de inmediato con varios lenguajes fundamentalmente diferentes, por ejemplo, C, Haskell y Smalltok, en cualquier orden. Ni un solo idioma en
por separado no dará una comprensión completa.
Haskell es un idioma bastante antiguo. ¿Es bueno o malo?
Yuri Syrovetsky: El lenguaje se está desarrollando de manera muy activa, la carga de compatibilidad solo por el hecho de la compatibilidad no tira.
John Doe : El estándar se adoptó en 1998, pero esto no se nota: hasta ahora, se lanzan nuevas versiones del compilador, que potencialmente rompen la compatibilidad con versiones anteriores, aproximadamente cada seis meses.
Denis Mirzoev : Haskell no es viejo, pero está probado en el tiempo. Los cambios irreflexivos nunca entrarán en el idioma. Entonces es bastante bueno.
Se dice que Haskell es uno de los idiomas más complejos. Es asi?
Doctor_Ryner : Al igual que el lenguaje en sí, no. Lo más probable son las abstracciones que se utilizan en él. Una persona que nunca ha visto el código Haskell puede volverse loco con el flujo de nueva información y varias construcciones inusuales.
El petróleo agrega al fuego que el lenguaje impone un montón de "restricciones", no permite o complica en gran medida un montón de cosas que no encajan en un concepto funcional.
John Doe : Para que el primer proyecto de primaria se compilara al menos, tomó casi dos meses fumar libros de texto, manuales y tutoriales por las tardes. Es cierto que después de la compilación, el proyecto comenzó a funcionar de inmediato e higos a plena carga (6k rps con picos de hasta 15) durante seis meses, sin ningún cambio en absoluto.
Denis Mirzoev : Apuesto a que si un estudiante comienza a estudiar programación de Haskell y se mueve lo suficiente, entonces la programación imperativa le parecerá más complicada y menos intuitiva.
Igor Shevnin : La complejidad es relativa. De los lenguajes principales, todavía encuentro C ++ como el más complejo. Los lenguajes para probar teoremas (Agda, Coq) serán más complicados que Haskell en un sentido conceptual. Haskell es un lenguaje simple, pero sus patrones y bibliotecas, estándar y de terceros, se pueden aprender de forma inmediata.
¿Está siempre justificada su complejidad?
Igor Shevnin : los patrones y un alto nivel de abstracción están justificados, ya que hacen que el código sea más confiable y más corto. Pero creo que los operadores, los nombres de las funciones y muchas otras cosas podrían ser más claros.
Doctor_Ryner : A menudo, las construcciones complejas de Haskell le permiten crear soluciones muy cortas, que también resultan ser muy flexibles y modulares.
Yuri Syrovetsky : Excepto que manejar los efectos es engorroso, aunque casi
siempre es mejor que la falta de control. Pero sobre simplificarlo
El trabajo está en marcha.
John Doe : El lenguaje para aquellos acostumbrados a python / php / lo que sea, generalmente lo hace parecer ortogonal a la realidad. Para las personas que inicialmente no estaban interesadas en la teoría de categorías, lograr resultados del cero absoluto es muy difícil.
Pero cuando comprende el idioma, obtiene una nueva forma de pensar sobre el problema que se está resolviendo.
Haskell parece ser un lenguaje para matemáticos, no para desarrolladores. ¿Crees que no está muy extendido por esto?
Denis Mirzoev : Esta es una demostración del principio que siguen los principales desarrolladores de Haskell: "evitar el éxito a toda costa". El punto, por supuesto, no es evitar el éxito, sino evitar el éxito, cuyo precio es demasiado alto.
Haskell podría hacerse popular. Hay, por ejemplo, soporte para este idioma de Microsoft. Era posible hacer que el lenguaje fuera más imperativo, tomar algunas decisiones rápidas y mal concebidas para ganar popularidad. Era posible usar muchos trucos sucios, pero gracias a una posición tan correcta de los principales desarrolladores no había nada como esto.
Sí, la popularidad del idioma no es muy alta, pero su calidad no sufre. Las ventajas de Haskell sobre los idiomas imperativos son obvias para mí, la mayoría de sus problemas se pueden resolver, por lo que estoy seguro de que a medida que se desarrolle, obtendré una gran popularidad.
Yuri Syrovetsky : Entonces solo lo ven personas que no saben nada de él. En
Haskell ha estado utilizando el desarrollo "real" durante mucho tiempo, los ejemplos son fáciles de encontrar en
tu motor de búsqueda favorito En particular, estamos en LC usando
Haskell está satisfecho y no vemos nada más en su lugar.
Igor Shevnin : ¿Qué es un "lenguaje para matemáticos"? Realmente no lo sé. Esto es R / MatLab / Mathematica para cálculos y estadísticas, o Python, porque es simple y requiere menos experiencia en ingeniería. Pero no Haskell. Los conceptos algebraicos como los monoides se utilizan en él por razones prácticas, y no solo por rigor adicional.
El papel principal en popularidad fue jugado por la prevalencia histórica de C / C ++ / Java / C # en la empresa, ocuparon un nicho. Pero ahora, muchas compañías están comenzando a usar Haskell y otros lenguajes funcionales.
¿Con qué ladrón compararías a Haskell y a favor de quién?
John Doe : más o menos común, con Erlang. Pero Erlang sigue siendo más fácil de escribir y más fácil de aprender, me parece.
Denis Mirzoev : Conozco bien C, C ++, Java y Haskell. C ++ ni siquiera necesita ser comparado con nada, el lenguaje es terrible. C es un buen lenguaje para el desarrollo de bajo nivel. En este nicho, él será mejor. De lo contrario, preferiría Haskell.
La elección entre Java y Haskell ya es más difícil, pero aquí también debe analizar una tarea específica. Para Android en Haskell lo más probable es que sea difícil de escribir, en este caso Java es mejor. Pero el servidor para escribir en Haskell es casi tan conveniente como en Java. Si el entorno lo permite (ajuste, accesibilidad de las bibliotecas), generalmente elijo Haskell.
Doctor_Ryner : Con C #, solo
busque en Google cómo implementar Quizás en C # y en Haskell. Es muy extraño que el dictatorial puramente funcional de Haskell se sienta mucho más flexible y libre. De hecho, estos son dos extremos.
C # es uno de los lenguajes más orientados a objetos, y los beneficios de Haskell están en marcado contraste con él. En C # constantemente tienes que escribir un montón de cosas innecesarias, y todo esto es muy desagradable. El uso de funciones de orden superior puede estropear el código en términos de sintaxis. En medio de todo esto, ya es difícil regresar de las soluciones cortas y elegantes de Haskell.
Igor Shevnin : Con Rust, hasta ahora a favor de Rust. Se necesita mucho de Haskell y otros lenguajes de FP, pero al mismo tiempo el enfoque funcional es amigable con el imperativo, y los desarrolladores y la comunidad son mucho más competentes y más consistentes en el desarrollo del lenguaje desde el principio.
¿Qué opinas de la comunidad haskellista?
John Doe : La gran mayoría son personas muy amigables que siempre están listas para ayudar. Una buena diferencia de las comunidades de muchos otros idiomas.
Doctor_Ryner : Las comunidades de Haskell a menudo contienen personas terriblemente inteligentes que siempre están listas para ayudar. No en vano van los memes locales sobre doctorado, teoría de categorías y académicos. Si entra al chat en otros idiomas, verá que las personas están discutiendo problemas de producción y estructuras de datos comunes. En un chat de Haskell, las mónadas, el lema de Yoneda, los actores aplicativos, escribir tipos locos, etc., aparecen inmediatamente frente a ti.
Inmediatamente ves tantas novedades que no sabías antes: composiciones locas, transformaciones y transformaciones elegantes, soluciones a problemas que ocupan docenas de líneas en los idiomas principales, casi en una sola línea.
Dicen que los Haskellistas son arrogantes. Derecho?
Denis Mirzoev : Sí. Me parece que la arrogancia se debe al hecho de que realmente aman su idioma y están molestos por su subestimación.
John Doe : Nifiga así.
Doctor_Ryner : Lo más probable es que esta opinión haya desaparecido, debido al hecho de que muchos desarrolladores convencionales están muy molestos cuando los Haskelistas comienzan a hablar sobre programación funcional y sus ventajas. Un terrible malentendido, a su vez, puede molestar al propio Haskelist, y comenzará a apresurarse en términos, por lo que las preguntas frecuentes lo estigmatizan.
Igor Shevnin : Arrogancia es una palabra demasiado fuerte. El punto aquí es más bien que FP, OOP, la diferencia entre las clases de OOP y los tipos de unión, el problema de extensión y muchos otros conceptos una vez se suman a una imagen muy clara, y después de eso se hace difícil percibir a las personas que intentan oponerse a OOP y FI o, de lo contrario, imaginar problema generalizado en una perspectiva estrecha.
¿Por qué los lenguajes FP siguen siendo nicho?
Denis Mirzoev : Sus ventajas aún no son suficientes para interesar a un gran número de programadores. La dificultad en el aprendizaje no conduce a la popularidad. Los problemas con el ajuste también ahuyentan a muchos, pero me parece que solo aumentar el tamaño de la comunidad podría resolver este problema. Resulta un círculo vicioso.
Igor Shevnin : el nicho está pasando gradualmente y los conceptos funcionales se están trasladando a otros idiomas.
Doctor_Ryner : Los principios funcionales en sí mismos y los lenguajes que los respaldan ya son omnipresentes. Incluso para objetos punzantes, hay Linq y algunas otras bibliotecas. Los nichos son lenguajes bastante puramente funcionales, ya que utilizan conceptos no estándar.
No olvide que hace 20 años, el hierro no era lo suficientemente productivo para los lenguajes funcionales, por lo que el funcionalismo comenzó a entrar en la corriente principal en los últimos años, y el interés en Haskell solo está creciendo.