Show HN: Numbat – Un lenguaje de programación con dimensiones físicas como tipos

Un nuevo lenguaje llamado Numbat pretende tratar las dimensiones físicas y las unidades como tipos, permitiendo comprobaciones en tiempo de compilación que detecten errores como sumar metros y segundos o usar mal constantes en fórmulas físicas. Los comentaristas lo comparan con sistemas de unidades en F#, Rust, Julia, C++, Nim, Ada y herramientas como GNU Units y Frink, sopesando los beneficios de un DSL dedicado y tipado estáticamente frente a bibliotecas incrustadas en lenguajes de propósito general. También examinan casos límite más difíciles —como el tiempo calendario frente al cronológico, la conversión de divisas y el álgebra lineal con unidades—, destacando dónde el enfoque es potente hoy y dónde el sistema de tipos y las bibliotecas tendrían que crecer.

Alcance de las unidades y dimensiones “físicas”

  • Debate sobre si la luz, la temperatura y el tiempo son “físicos” frente a solo espaciales; el consenso en el hilo se inclina hacia que “físico” significa “descrito por la física”, no solo espacio 3D.
  • Se mencionan la relatividad y los cuadrivectores para argumentar que el tiempo está estrechamente acoplado al espacio.
  • Algunos rechazan afirmaciones marginales de física que cuestionan el espacio-tiempo, señalando que no son corrientes.

Ecosistemas existentes y “reinventar la rueda”

  • Muchos señalan sistemas similares de unidades/dimensiones: Python (Pint, astropy.units), F# Units of Measure, uom de Rust, Unitful.jl de Julia, Squants de Scala, Nim (Unchained), GNU units, análisis dimensional de Ada, unidades basadas en plantillas de C++, Frink y el proyecto anterior Insect.
  • Algunos argumentan que Numbat es redundante; otros señalan que, al estar hecho a propósito, ser estático, de código abierto y apuntar a WebAssembly, tiene un nicho.

Sistema de tipos, funciones matemáticas y ángulos

  • Las funciones trigonométricas y trascendentales en Numbat solo aceptan escalares adimensionales; pasar cantidades con unidades se trata como probablemente un error.
  • Los ángulos se tratan como convertibles a escalares (radianes, grados, vueltas); se reconoce explícitamente que si los ángulos son adimensionales es algo debatido.

Tiempo, meses y años

  • Los meses y años se modelan como duraciones promedio (por ejemplo, un año gregoriano ≈ 365,2425 días).
  • Varios comentaristas califican esto como una ambigua “confusión de unidades” y distinguen unidades “cronológicas” de “calendariales”, señalando días bisiestos, segundos intercalares, horario de verano, año sidéreo frente a tropical, etc.
  • Otros defienden el enfoque simplificado como pragmático y advierten contra arrastrar toda la complejidad del calendario al sistema de tipos.
  • Numbat actualmente trata el tiempo como duraciones, no como fechas de calendario; aún no existe una API de calendario del tipo “hoy + 14 días”.

Álgebra lineal y unidades heterogéneas

  • Dificultad clásica: vectores/matrices en los que cada componente tiene unidades distintas (por ejemplo, modelos económicos de input-output, operadores derivados).
  • Numbat por ahora carece de tipos agregados (vectores, matrices). Se reconoce que el problema es solucionable pero “delicado”.
  • La discusión señala que muchos sistemas de tipos estáticos asumen unidades homogéneas por contenedor, lo que choca con el álgebra lineal del mundo real.

Moneda y modelado del mundo real

  • La moneda se admite como una unidad con tipos de cambio en vivo del Banco Central Europeo.
  • Algunos ven esto como una función interesante; otros lo consideran superficial frente a la complejidad de las finanzas y la economía reales.

Ergonomía, sintaxis y entusiasmo

  • Comentarios positivos sobre la CLI interactiva, el rico catálogo de unidades, los operadores Unicode (×, ⋅, ÷) y la introducción legible.
  • Algunos usuarios expresan un entusiasmo y apoyo muy fuertes, incluido patrocinio, y ven Numbat como una excelente calculadora/DSL para computación consciente de unidades.