1 puntos por GN⁺ 2024-12-04 | Aún no hay comentarios. | Compartir por WhatsApp
  • Un desarrollador compara la experiencia real de desarrollo entre dos lenguajes funcionales basándose en haber usado Haskell durante 8 años y OCaml durante 8 meses en producción
  • Haskell ofrece una sintaxis más concisa y funciones de tipos más potentes, pero al tener tantas opciones es fácil distraerse con el diseño y la abstracción
  • OCaml, aunque tiene menos funcionalidades, es valorado porque sus módulos de primera clase, su mutabilidad práctica y su estilo de código predecible facilitan concentrarse en la implementación
  • El ecosistema de Haskell es más grande, pero elegir librerías puede sentirse como una habilidad aparte; OCaml, aunque más pequeño, hace que las herramientas necesarias funcionen mejor de lo esperado
  • Ambos lenguajes siguen siendo más pequeños que los lenguajes dominantes y sus bibliotecas estándar son bastante mínimas, pero si no dependes mucho de un SDK específico, ambos alcanzan bien para desarrollar aplicaciones industriales

Punto de partida de la comparación

  • La referencia es la experiencia de haber usado Haskell en producción durante 8 años y OCaml durante 8 meses
  • Los ejes de comparación son sintaxis, funciones del lenguaje, ecosistema, herramientas, mensajes del compilador y biblioteca estándar
  • Ambos lenguajes han evolucionado lo suficiente como para cubrir necesidades reales de la industria, pero hoy la preferencia está más cerca de OCaml

Sintaxis: Haskell es más conciso, y OCaml también tiene las ventajas de la familia ML

  • Haskell permite expresar ideas con muy pocos caracteres, lo que le da una fuerte sensación de elegancia sintáctica
  • OCaml también es excelente como lenguaje de la familia ML, pero Haskell ofrece un estilo más implícito (tacit)
  • En el ejemplo de sumar números dentro de una cadena, Haskell lo expresa de forma breve con sum . map read . words, mientras que OCaml deja explícitos en una tubería los pasos de separar la cadena, transformar y reducir
  • La definición de tipos para árboles binarios se expresa de forma natural en ambos lenguajes mediante tipos de datos algebraicos
  • En los ejemplos de parsing, ambos usan pattern matching y valores opcionales, pero Haskell usa notación do y guard, mientras que OCaml usa Option.bind y match explícito

Funciones: Haskell es más rico, OCaml distrae menos

  • Haskell tiene una cantidad enorme de funcionalidades, al punto de que se siente comparable con C++ en ese aspecto
  • Muchas de esas funciones son herramientas para resolver problemas con precisión, pero también pueden hacer que uno se quede pensando en cómo diseñar la solución antes de implementar
  • En Haskell es fácil perderse evaluando opciones como TypeFamilies, DataKinds o GADTs
  • En un proyecto heredado de OCaml, los problemas malos suelen ser nombres de variables pobres, poca documentación o funciones de más de 200 líneas, algo que se considera manejable
  • En cambio, en un proyecto heredado de Haskell puede aparecer una complejidad difícil de anticipar incluso con 8 años de experiencia
  • Por esa diferencia, se siente más productividad en OCaml
  • Funciones compartidas por ambos lenguajes

    • Ambos ofrecen sintaxis centrada en expresiones, inmutabilidad por defecto, funciones de orden superior, funciones anónimas, tipos de datos algebraicos y pattern matching
    • También comparten polimorfismo paramétrico, inferencia de tipos, azúcar sintáctica para mónadas, recolector de basura, multithreading y GADTs
  • Funciones más destacadas de Haskell

    • Haskell ofrece pureza por defecto, evaluación perezosa componible, type classes, tipos de kind superior y extensiones opcionales del lenguaje
    • Como tiene muchas funciones potentes, la forma de abstraer puede variar mucho entre proyectos
  • Funciones más destacadas de OCaml

    • OCaml ofrece módulos de primera clase (first-class modules), variantes polimórficas, objetos, clases y herencia, además de mutabilidad fácil de usar
    • Su rango de funciones es más acotado que el de Haskell, pero eso ayuda a que el código sea más predecible

Ecosistema: Haskell es más grande, OCaml tiene las soluciones necesarias

  • Ambos lenguajes son lenguajes funcionales de nicho, así que no es fácil esperar soporte de primera clase para los frameworks más recientes
  • Aun así, para la mayoría de las tareas comunes sí hay soluciones, y en algunos casos hay que escribir más bindings personalizados
  • En OCaml también se pueden encontrar paquetes útiles para trabajo real, como:
  • El ecosistema de Haskell tiene más paquetes y más soluciones listas para usar
  • Para la API de Stripe, Haskell tiene 13 bibliotecas cliente y OCaml solo 1; además, la de OCaml no se actualiza desde hace 8 años, así que en la práctica es casi como tener 0
  • En Haskell, incluso después de encontrar una solución, todavía hay que decidir cuál librería elegir entre demasiadas opciones
  • Elegir librerías llega a sentirse como una habilidad aparte, al punto de que existe un texto sobre cómo evaluar librerías
  • Muchas librerías nuevas de Haskell no nacen para resolver un problema distinto, sino porque alguien quiere reescribir algo con otra abstracción o una función nueva
  • Puede resultar más interesante diseñar un logger con comonads que crear un cliente para la API de GitHub y parsear mucho JSON

Herramientas: Haskell es potente pero irregular, OCaml funciona bien

  • Las herramientas de Haskell combinan ventajas muy poderosas con problemas de usabilidad
  • Hoogle es una herramienta muy potente porque permite buscar en todo el ecosistema solo con la firma de tipos
  • Por otro lado, hay problemas como mensajes de error del sistema de build, situaciones donde no encuentra un plan de compilación en un proyecto que sí funciona, recompilaciones del IDE tras cambiar paquetes o ausencia de documentación de la biblioteca estándar para ciertas versiones
  • La experiencia usando herramientas de Haskell mezcla momentos de sorpresa por cómo otros lenguajes se usan sin herramientas así, y momentos de sorpresa por cómo quienes usan Haskell toleran la falta de usabilidad básica
  • OCaml tiene un ecosistema más pequeño, así que sorprende cada vez que algo simplemente funciona
  • El plugin de OCaml para VSCode basado en LSP funcionó sin ajustes adicionales y no dio problemas
  • Aunque la experiencia inicial con las herramientas de OCaml no sea la más cómoda del mundo, sí es intuitiva, sólida y en la mayoría de los casos funciona como debe
  • Comparación de herramientas

Mensajes del compilador: Haskell es verboso, OCaml es conciso

  • En los lenguajes funcionales, el compilador es una herramienta clave para entender por qué el código no cumple los supuestos que uno pretendía
  • Por eso, los mensajes de error deben mostrar la información necesaria de una forma fácil de consultar
  • Los mensajes del compilador de Haskell suelen tener mucho contexto y ser extensos, e incluyen información redundante o que distrae
  • Los mensajes del compilador de OCaml son bastante concisos, y a veces demasiado concisos
  • El programa de ejemplo con error intenta sumar un entero y una lista, como en Haskell con x = 1 + [3, 1, 2] y en OCaml con let x = 1 + [3; 1; 2]

Biblioteca estándar: ambas son mínimas, pero la documentación de Haskell destaca

  • La biblioteca estándar define tanto la experiencia del primer programa como la del uso posterior del lenguaje
  • Una buena biblioteca estándar es base del éxito de un lenguaje de programación, y una biblioteca insuficiente puede mantener eternamente el debate sobre bibliotecas estándar alternativas
  • La biblioteca estándar ideal debería acercarse a un enfoque batteries-included
  • Entre los componentes deseables estarían un tipo similar a Option, cadenas UTF-8, Map y HashMap, parsers de JSON y XML, y primitivas asíncronas
  • Si no quieres aprender a implementar herramientas de build y seguimiento de dependencias, hace falta más funcionalidad en la biblioteca estándar
  • Build Systems a la Carte es un material que analiza el área de los rastreadores de dependencias y las herramientas de build
  • Tanto Haskell como OCaml tienen bibliotecas estándar relativamente mínimas
    • Haskell no incluye Map ni HashMap
    • OCaml no incluye non-empty lists ni Bitraversable
  • La biblioteca estándar de Haskell es base, y la de OCaml es la biblioteca estándar de OCaml
  • La calidad de la documentación de Haskell a veces es tan buena que incluso sorprende a desarrolladores experimentados
  • La documentación de Haskell también tiene ventajas como poder saltar al código fuente, y se menciona que en OCaml algo así estaría en camino
  • Ejemplos de documentación

    • Ejemplos de documentación de listas en Haskell
    • Ejemplos de documentación de listas en OCaml
    • Incluso cuando el resultado de una función es obvio, una documentación centrada en ejemplos ayuda a entender de inmediato cómo usar la API

Conclusión: ambos sirven para uso industrial, pero hoy la preferencia es OCaml

  • Ambos lenguajes han avanzado lo suficiente como para cubrir necesidades reales de la industria
  • En comparación con los lenguajes dominantes, siguen siendo lenguajes pequeños
  • Si no dependes de forma crítica de la existencia de un SDK específico, con cualquiera de los dos puedes desarrollar tu próxima app con gusto
  • Hoy se valora a OCaml como la opción que facilita más concentrarse en construir algo real

Aún no hay comentarios.

Aún no hay comentarios.