Articulo de referencia

Idris (lenguaje de programación)

{{cite web |last=Brady |first=Edwin |date=2007-12-12 |title=Index of /~eb/darcs/Idris |url=http://www-fp.cs.st-and.ac.uk/~eb/darcs/Idris/ |website=[[University of St Andrews]] S...

Idris es un lenguaje de programación puramente funcional con tipos dependientes , anotaciones de cantidad , evaluación perezosa opcional y características como un verificador de totalidad . Idris está diseñado para ser un lenguaje de programación de propósito general similar a Haskell , pero también puede usarse como asistente de demostración .

El sistema de tipos de Idris es similar al de Agda . En comparación con Agda, Idris prioriza la gestión de efectos secundarios y el soporte para lenguajes específicos de dominio integrados . Idris se compila mediante backends modulares, que proporcionan generación de código y un sistema de tiempo de ejecución . [ 5 ] El compilador de Idris incluye backends para Chez Scheme , Racket , JavaScript (tanto para navegador como para Node.js ) y C. Hay backends adicionales de terceros disponibles para otras plataformas. [ 6 ]

Idris recibe su nombre de un dragón cantante del programa de televisión infantil británico de los años 70, Ivor the Engine . [ 7 ]

Características

Idris combina varias características de lenguajes de programación funcional relativamente convencionales con características tomadas de asistentes de demostración .

Programación funcional

La sintaxis de Idris muestra muchas similitudes con la de Haskell. Un programa "hola mundo" en Idris podría verse así:

Módulo principalprincipal : IO () principal = putStrLn "¡Hola, mundo!"

Las únicas diferencias entre este programa y su equivalente en Haskell son el uso de un solo punto (en lugar de dos) en la firma de tipo de la función principal y la omisión de la palabra " where" en la declaración del módulo . [ 8 ]

Tipos de datos inductivos y paramétricos

Idris admite tipos de datos definidos inductivamente y polimorfismo paramétrico . Dichos tipos se pueden definir tanto en la sintaxis tradicional tipo Haskell 98 :

Datos Árbol a = Nodo ( Árbol a ) ( Árbol a ) | Hoja a 

o en una sintaxis más general similar a la de los tipos de datos algebraicos generalizados (GADT):

Árbol de datos : Tipo -> Tipo donde Nodo : Árbol a -> Árbol a -> Árbol a Hoja : a -> Árbol a 

Tipos dependientes

Con los tipos dependientes , es posible que aparezcan valores en los tipos; en efecto, cualquier cálculo a nivel de valor puede realizarse durante la verificación de tipos . A continuación se define un tipo de listas cuyas longitudes se conocen antes de que se ejecute el programa, tradicionalmente llamadas vectores :

datos Vect : Nat -> Type -> Type donde Nil : Vect 0 a (::) : ( x : a ) -> ( xs : Vect n a ) -> Vect ( n + 1 ) a 

Este tipo se puede utilizar de la siguiente manera:

agregar total : Vecto n a -> Vecto m a -> Vecto ( n + m ) a agregar Nil ys = ys agregar ( x :: xs ) ys = x :: agregar xs ys 

La función appendagrega un vector de melementos de tipo aa un vector de nelementos de tipo a. Dado que los tipos precisos de los vectores de entrada dependen de un valor, es posible estar seguro en tiempo de compilación de que el vector resultante tendrá exactamente ( n+ m) elementos de tipo a. La palabra " total" invoca al verificador de totalidad que informará un error si la función no cubre todos los casos posibles o no se puede probar (automáticamente) que no entra en un bucle infinito .

Otro ejemplo común es la suma por pares de dos vectores que están parametrizados en función de su longitud:

Total pairAdd : Num a => Vect n a -> Vect n a -> Vect n a pairAdd Nil Nil = Nil pairAdd ( x :: xs ) ( y :: ys ) = x + y :: pairAdd xs ys 

NumLa letra a indica que el tipo a pertenece a la clase de tiposNum . Nótese que esta función sigue superando la comprobación de tipos como total, aunque no haya coincidencia de mayúsculas y minúsculas Nilen un vector y un número en el otro. Dado que el sistema de tipos puede demostrar que los vectores tienen la misma longitud, podemos estar seguros en tiempo de compilación de que no se producirá ninguna coincidencia de mayúsculas y minúsculas y no es necesario incluirla en la definición de la función.

Características del asistente de pruebas

Los tipos dependientes son lo suficientemente potentes como para codificar la mayoría de las propiedades de los programas, y un programa Idris puede demostrar invariantes en tiempo de compilación. Esto convierte a Idris en un asistente de demostración.

Existen dos formas estándar de interactuar con los asistentes de demostración: mediante la escritura de una serie de invocaciones tácticas ( estilo Rocq ) o mediante la elaboración interactiva de un término de demostración ( estilo Epigram -Agda). Idris admite ambos modos de interacción, aunque el conjunto de tácticas disponibles aún no es tan útil como el de Rocq.

Generación de código

Dado que Idris incluye un asistente de pruebas, los programas Idris pueden escribirse para pasar pruebas entre sí. Si se tratan de forma ingenua, dichas pruebas permanecen durante la ejecución. Idris busca evitar este problema eliminando de forma agresiva los términos no utilizados. [ 9 ] [ 10 ]

Por defecto, Idris genera código nativo a través de C. El otro backend oficialmente compatible genera JavaScript .

Idris 2

Idris 2 es una nueva versión autoalojada del lenguaje que integra profundamente un sistema de tipos lineal , basado en la teoría de tipos cuantitativa . Actualmente compila a Scheme y C. [ 11 ]

Véase también

Referencias

  1. Brady, Edwin (12 de diciembre de 2007). "Índice de /~eb/darcs/Idris" . Facultad de Informática de la Universidad de St Andrews . Archivado del original el 20 de marzo de 2008.
  2. "Versión [ v0.8.0 ] Versión de Halloween 2025" . GitHub . Consultado el 31 de agosto de 2025 .
  3. 1 2 "Tipos de unicidad" . Documentación de Idris 1.3.1 . Consultado el 26 de septiembre de 2019 .
  4. 1 2 3 "Idris, un lenguaje con tipos dependientes" . Consultado el 26 de octubre de 2014 .
  5. "Compilación a ejecutables" . Documentación del lenguaje Idris 2 . Consultado el 1 de noviembre de 2025 .
  6. "Backends externos" . Wiki de Idris2 . Consultado el 1 de noviembre de 2025 .
  7. "Preguntas frecuentes" . Consultado el 19 de julio de 2015 .
  8. "Guía de sintaxis – Documentación de Idris 1.3.2" . Consultado el 27 de abril de 2020 .
  9. "Borrado por análisis de uso: la documentación más reciente de Idris" . idris.readthedocs.org .
  10. "Resultados de referencia" . ziman.functor.sk .
  11. "idris-lang/Idris2" . GitHub . Consultado el 11 de abril de 2021 .
  • Sitio web oficial , documentación, preguntas frecuentes, ejemplos
  • Idris en el repositorio de Hackage
  • Documentación sobre el idioma Idris (tutorial, referencia lingüística, etc.)