Entradas

Pattern Matching

Imagen
El Pattern Matching (coincidencia de patrones) es un mecanismo que compara una expresión con una estructura específica, la descompone en sus partes constituyentes y, si la comparación es exitosa, asigna variables a dichas partes. Reemplaza las complejas estructuras condicionales if-else con bloques de código declarativos más limpios. Está técnica es similar al uso del switch excepto que en lugar de comparar el valor de una variable o expresión, compara la estructura. Pattern Matching en Haskell Veamos para qué nos puede servir y cómo la podemos emplear. ¿Para qué se utiliza? Revisar tipos y formas: Comprobar si un dato es un número, un texto, una lista o un objeto de cierto tipo. Desarmar datos: Abrir objetos, tuplas o estructuras complejas para sacar sus valores internos sin usar funciones largas de extracción. Reemplazar múltiples if / else : Escribir código más corto, ordenado y fácil de leer al evaluar opciones. Ejemplos de Pattern Matching El c...

Koka: un lenguaje funcional con tipos de efectos y manejadores

Imagen
Koka es un lenguaje de programación funcional fuertemente tipado cuyo rasgo más distintivo es el uso de tipos de efectos (effect types) combinados con handlers. Es funcional (como Haskell). Tiene tipado estático fuerte. Pero además hace explícitos los efectos en los tipos. Relación con Haskell Koka y Haskell están muy relacionados conceptualmente: Aspecto Relación Paradigma Ambos son funcionales Tipado Ambos con tipado fuerte y avanzado Pureza Ambos promueven funciones puras Base teórica Comparten fundamentos (lambda calculus, tipos) Haskell: "los efectos están encapsulados en monadas". Koka: "los efectos forman parte del tipo". Instalando Koka Abrimos una terminal y tecleamos lo sigu...

Lenguajes similares Haskell: Agda

Imagen
Agda es un lenguaje de programación funcional con tipado dependiente. Donde los tipos pueden depender de valores, lo que permite expresar invariantes directamente en el sistema de tipos. Es una extensión de la teoría de tipos de Martin-Löf y representa el desarrollo más reciente de lenguajes creados en el grupo de lógica de programación de Chalmers. "Gracias a su fuerte tipado y a los tipos dependientes, Agda puede utilizarse como asistente de demostración, lo que permite probar teoremas matemáticos (en un entorno constructivo) y ejecutar dichas pruebas como algoritmos". Además de programar, puedes demostrar teoremas y verificar que tu código cumple propiedades matemáticas. Se usa principalmente con Emacs, que ofrece asistencia paso a paso para escribir programas y pruebas. La similitud con Haskell coniste en compartir la orientación funcional, pero Agda va más allá al integrar la lógica formal en el lenguaje. Comparativa con Haskell Obse...

WebAssembly con Haskell

Imagen
WebAssembly es un lenguaje de bajo nivel, similar a ensamblador, diseñado para ser rápido de cargar y ejecutar en navegadores modernos. Su objetivo es permitir que aplicaciones escritas en distintos lenguajes se ejecuten en la web con velocidad casi nativa. Los formatos que soporta son: .wasm : un formato binario ejecutable.  .wat : un formato formato de texto legible. Se complementa con JavaScript; permite invocar funciones WASM desde JS y viceversa. ¿Cuál es el objetivo de WebAssembly? El objetivo de WebAssembly es compilar código escrito en lenguajes como Rust, C o C++ (entre otros) y transformarlo en un módulo .wasm que puede ejecutarse en navegadores o en entornos como Node.js con rendimiento cercano al nativo. Flujo típico de trabajo con WebAssembly Escribimos nuestro código en un lenguaje soportado (ej. Rust, C, C++, Go, AssemblyScript).  Compilamos ese código a WebAssembly y se generará un archivo .wasm .  Cargamos el módulo en tu aplicaci...

Programación funcional en Haskell

Imagen
Uno de los puntos fuertes de Haskell es la programación funcional pura . La cual se centra en funciones matemáticas puras, sin efectos secundarios , y en transformar datos de manera predecible. Donde cada función es como una receta que recibe ingredientes (datos de entrada) y devuelve un resultado (salida). Donde las funciones no alteran cosas externas (osea, sin efectos secundarios), solo trabajan con lo que reciben. Donde los datos no cambian , se transforman en nuevos resultados . Donde no se evalúa una expresión hasta que su resultado sea estrictamente necesario , permitiendo el manejo de estructuras de datos infinitas. Con Haskell es como si trabajaras con fórmulas matemáticas, cada función es una operación que siempre da el mismo resultado con los mismos datos. Incluso permitiendo que las funciones tomen a otras funciones como argumentos, o simplemente devolviendo éstas. Es como hacer un jugo de naranja. Tomas la naranja y la exprimes, y así obtienes su j...

Tipos de datos en Haskell

Imagen
Como hemos mencionado, Haskell es un lenguaje de programación funcional de tipado estático . ¿Qué quiere decir esto? En Haskell es necesario especificar qué tipos de datos vamos a emplear en nuestros programas.  Puesto que al compilar el programa (sí, Haskell se compila) se evaluarán los tipos para saber si son enteros, booleanos o cadenas de caracteres. Además al tener inferencia de tipos no tenemos que especificar, por ejemplo, que un número es un número. Comprobemos esto. Abrimos una terminal y tecleamos: $ ghci Esto abrirá el REPL de Haskell . Usemos el comando :type o el abreviado :t para ver los tipos de datos. ghci > : type "Esto es una cadena" "Esto es una cadena" :: String ghci > : type 33 33 :: Num a => a ghci > : type True True :: Bool ghci > :t 'X' 'X' :: Char ghci > :t 23 + 32 23 + 32 :: Num a => a En este ejemplo vemos los tipos: Char , String , ...

Cabal en otro vistazo

Imagen
Como vimos en una entrega anterior , Cabal es la herramienta estándar para gestionar dependencias, compilar y empaquetar proyectos Haskell, lo que te permite organizar y distribuir tu código de manera profesional. Con Haskell (y Cabal) podemos desarrollar desde pequeñas utilidades de línea de comandos hasta aplicaciones web, bibliotecas científicas, proyectos de análisis de datos y compiladores. Recapitulando: Cabal es el sistema de construcción y empaquetado de Haskell.  Se basa en archivos .cabal que describen el proyecto: nombre, dependencias, módulos, ejecutables, etc.  Permite compilar, instalar y distribuir bibliotecas y programas de forma portable.  Es el equivalente a package.json en Node.js o pom.xml en Maven. Conversión de grados Celsius a Fahrenheit con Haskell (y Cabal) Crearemos una sencilla calculadora de conversión de grados Celsius a Fahrenheit. El único dato necesario serán los grados en Celsius. 1. Mostramos la versión instal...