{"id":29616866,"url":"https://github.com/dieg0code/haskell","last_synced_at":"2025-07-21T01:04:31.936Z","repository":{"id":305533146,"uuid":"1023100585","full_name":"Dieg0Code/Haskell","owner":"Dieg0Code","description":"Notas y apuntes personales sobre la programación funcional con Haskell","archived":false,"fork":false,"pushed_at":"2025-07-20T15:58:17.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-20T17:42:06.338Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dieg0Code.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-20T14:26:28.000Z","updated_at":"2025-07-20T15:58:20.000Z","dependencies_parsed_at":"2025-07-20T17:52:21.337Z","dependency_job_id":null,"html_url":"https://github.com/Dieg0Code/Haskell","commit_stats":null,"previous_names":["dieg0code/haskell"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Dieg0Code/Haskell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FHaskell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FHaskell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FHaskell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FHaskell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dieg0Code","download_url":"https://codeload.github.com/Dieg0Code/Haskell/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FHaskell/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266222295,"owners_count":23894993,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-21T01:04:28.141Z","updated_at":"2025-07-21T01:04:31.931Z","avatar_url":"https://github.com/Dieg0Code.png","language":"Haskell","readme":"# Haskell: Programación Funcional Moderna 🚀\n\n[![Haskell](https://img.shields.io/badge/Haskell-5e5086?style=for-the-badge\u0026logo=haskell\u0026logoColor=white)](https://www.haskell.org/)\n[![GHC](https://img.shields.io/badge/GHC-9.4+-blue?style=for-the-badge)](https://www.haskell.org/ghc/)\n[![Cabal](https://img.shields.io/badge/Cabal-3.8+-green?style=for-the-badge)](https://www.haskell.org/cabal/)\n[![Stack](https://img.shields.io/badge/Stack-2.13+-orange?style=for-the-badge)](https://docs.haskellstack.org/)\n\n## 📖 Acerca de Haskell\n\nHaskell es un **lenguaje de programación funcional puro** con evaluación perezosa (lazy evaluation) y un sistema de tipos estático extremadamente potente. Nombrado en honor al matemático Haskell Curry, este lenguaje representa uno de los paradigmas más elegantes y expresivos en el mundo de la programación.\n\n### 🎯 Características Principales\n\n- **🔒 Pureza Funcional**: Sin efectos secundarios, inmutabilidad por defecto\n- **⚡ Evaluación Perezosa**: Computación bajo demanda para optimización automática\n- **🛡️ Sistema de Tipos Avanzado**: Hindley-Milner con inferencia automática\n- **🧮 Composición de Funciones**: Paradigma de \"construir programas combinando funciones\"\n- **📦 Gestión de Efectos**: Mónadas para manejar I/O, estado y otros efectos de forma controlada\n\n## 🛠️ Herramientas del Ecosistema Moderno\n\n### Gestores de Proyectos y Dependencias\n\n| Herramienta | Descripción                                      | Equivalente              |\n| ----------- | ------------------------------------------------ | ------------------------ |\n| **Cabal**   | Gestor oficial de paquetes y construcción        | `npm`, `cargo`           |\n| **Stack**   | Herramienta de construcción con reproducibilidad | `yarn`, `pipenv`         |\n| **Hackage** | Repositorio central de paquetes                  | `npmjs.com`, `crates.io` |\n\n### Entorno de Desarrollo\n\n- **GHC (Glasgow Haskell Compiler)**: Compilador principal con optimizaciones avanzadas\n- **GHCi**: REPL interactivo para prototipado rápido\n- **Haskell Language Server (HLS)**: LSP para IDEs modernos con autocompletado, refactoring y diagnósticos\n- **Hoogle**: Motor de búsqueda por tipos y funciones\n- **HLint**: Linter para sugerencias de mejora de código\n\n## 🚀 Comandos Esenciales\n\n### Gestión de Proyectos\n\n```bash\n# Inicializar proyectos\ncabal init --interactive\nstack new mi-proyecto\n\n# Gestión de dependencias\ncabal build\ncabal run\ncabal test\ncabal repl\n\n# Con Stack\nstack build\nstack exec mi-proyecto\nstack test\nstack ghci\n```\n\n### REPL y Desarrollo\n\n```bash\n# Iniciar REPL\nghci\ncabal repl\nstack ghci\n\n# Comandos útiles en GHCi\n:load archivo.hs     # Cargar archivo\n:reload              # Recargar archivos\n:type expresion      # Obtener tipo\n:info funcion        # Información de función\n:browse Modulo       # Explorar módulo\n```\n\n## 💡 Sintaxis Fundamental\n\n### Declaración de Funciones\n\n```haskell\n-- Función simple con signatura de tipo\ncuadrado :: Int -\u003e Int\ncuadrado x = x * x\n\n-- Función con múltiples parámetros\nsuma :: Int -\u003e Int -\u003e Int\nsuma x y = x + y\n\n-- Función de orden superior\naplicarDosVeces :: (a -\u003e a) -\u003e a -\u003e a\naplicarDosVeces f x = f (f x)\n\n-- Composición de funciones\n(.) :: (b -\u003e c) -\u003e (a -\u003e b) -\u003e a -\u003e c\nresultado = (cuadrado . suma 3) 5  -- (5 + 3)²\n```\n\n### Tipos de Datos Algebraicos\n\n```haskell\n-- Tipo suma (union type)\ndata Color = Rojo | Verde | Azul | RGB Int Int Int\n  deriving (Show, Eq)\n\n-- Tipo producto con parámetros\ndata Persona = Persona\n  { nombre :: String\n  , edad :: Int\n  , email :: String\n  } deriving (Show, Eq)\n\n-- Tipo recursivo\ndata Lista a = Vacia | Cons a (Lista a)\n  deriving (Show, Eq)\n\n-- Tipo paramétrico (Maybe es el equivalente a Optional/Nullable)\ndata Maybe a = Nothing | Just a\n```\n\n### Pattern Matching y Guardas\n\n```haskell\n-- Pattern matching exhaustivo\nfactorial :: Int -\u003e Int\nfactorial 0 = 1\nfactorial n = n * factorial (n - 1)\n\n-- Con guardas (guards)\nclasificarEdad :: Int -\u003e String\nclasificarEdad edad\n  | edad \u003c 13    = \"Niño\"\n  | edad \u003c 20    = \"Adolescente\"\n  | edad \u003c 60    = \"Adulto\"\n  | otherwise    = \"Adulto mayor\"\n\n-- Pattern matching con tipos algebraicos\nprocesarColor :: Color -\u003e String\nprocesarColor Rojo = \"Color primario: rojo\"\nprocesarColor Verde = \"Color primario: verde\"\nprocesarColor Azul = \"Color primario: azul\"\nprocesarColor (RGB r g b) = \"RGB(\" ++ show r ++ \",\" ++ show g ++ \",\" ++ show b ++ \")\"\n```\n\n### Listas y Programación de Alto Nivel\n\n```haskell\n-- Listas y rangos\nnumeros = [1, 2, 3, 4, 5]\ninfinitos = [1..]\npares = [2, 4..20]\n\n-- List comprehensions\ncuadrados = [x^2 | x \u003c- [1..10]]\nfiltrados = [x | x \u003c- [1..20], even x, x \u003e 10]\ncombinaciones = [(x, y) | x \u003c- [1..3], y \u003c- ['a'..'c']]\n\n-- Funciones de orden superior\nduplicados = map (*2) [1..5]              -- [2,4,6,8,10]\nfiltrados' = filter even [1..10]          -- [2,4,6,8,10]\nsuma = foldl (+) 0 [1..10]                -- 55\nproducto = foldr (*) 1 [1..5]             -- 120\n\n-- Operadores de lista\ncabeza = head [1,2,3]                     -- 1\ncola = tail [1,2,3]                       -- [2,3]\nconcatenacion = [1,2] ++ [3,4]            -- [1,2,3,4]\nelemento = 3 `elem` [1,2,3,4]             -- True\n```\n\n### Mónadas y Gestión de Efectos\n\n```haskell\n-- Maybe para manejar valores nulos\ndividir :: Float -\u003e Float -\u003e Maybe Float\ndividir _ 0 = Nothing\ndividir x y = Just (x / y)\n\n-- IO para efectos de entrada/salida\nmain :: IO ()\nmain = do\n  putStrLn \"¿Cómo te llamas?\"\n  nombre \u003c- getLine\n  putStrLn (\"Hola, \" ++ nombre ++ \"!\")\n\n-- Either para manejo de errores\ndata Error = DivisionPorCero | NumeroNegativo\n\ncalcularRaiz :: Float -\u003e Either Error Float\ncalcularRaiz x\n  | x \u003c 0     = Left NumeroNegativo\n  | otherwise = Right (sqrt x)\n```\n\n## 🎯 Conceptos Clave del Paradigma Funcional\n\n### ⚡ Evaluación Perezosa (Lazy Evaluation)\n\n```haskell\n-- Solo se evalúa cuando se necesita\ninfinitos = [1..]\nprimerosCinco = take 5 infinitos  -- [1,2,3,4,5]\n\n-- Permite estructuras de datos infinitas\nfibonacci = 0 : 1 : zipWith (+) fibonacci (tail fibonacci)\n```\n\n### 🔄 Inmutabilidad y Persistencia\n\n```haskell\n-- Las estructuras de datos son inmutables por defecto\nlista1 = [1, 2, 3]\nlista2 = 0 : lista1  -- [0, 1, 2, 3] (lista1 no cambia)\n\n-- Modificaciones crean nuevas estructuras\nimport qualified Data.Map as Map\nmapa1 = Map.fromList [(\"a\", 1), (\"b\", 2)]\nmapa2 = Map.insert \"c\" 3 mapa1  -- mapa1 permanece intacto\n```\n\n### 🧩 Composición y Currying\n\n```haskell\n-- Todas las funciones están currificadas\nsumar :: Int -\u003e Int -\u003e Int -\u003e Int\nsumar x y z = x + y + z\n\nsumar3 = sumar 3      -- Int -\u003e Int -\u003e Int\nsumar3y5 = sumar3 5   -- Int -\u003e Int\nresultado = sumar3y5 7 -- 15\n\n-- Composición elegante\nprocesamiento = map ((*2) . (+1)) [1..5]  -- [4,6,8,10,12]\n```\n\n## 📚 Librerías Esenciales del Ecosistema\n\n### 🏗️ Fundacionales\n\n- **base**: Librería estándar de Haskell\n- **containers**: Map, Set, IntMap, etc.\n- **text**: Manejo eficiente de texto Unicode\n- **bytestring**: Manejo eficiente de datos binarios\n\n### 🧪 Testing y Calidad\n\n- **hspec**: Framework de testing BDD\n- **QuickCheck**: Property-based testing\n- **tasty**: Framework de testing unificado\n- **hlint**: Linter y sugerencias de código\n\n### 🌐 Desarrollo Web y APIs\n\n- **servant**: APIs type-safe con generación automática de documentación\n- **wai/warp**: Abstracción de aplicaciones web\n- **aeson**: Parsing y generación JSON\n- **persistent**: ORM type-safe\n\n### ⚡ Performance y Concurrencia\n\n- **async**: Programación asíncrona\n- **stm**: Software Transactional Memory\n- **vector**: Arrays eficientes\n- **parallel**: Paralelización automática\n\n## 🎯 Objetivos de Aprendizaje\n\n- [ ] 🏗️ Dominar sintaxis y semántica funcional\n- [ ] 🔧 Comprender el sistema de tipos Hindley-Milner\n- [ ] ⚡ Aplicar evaluación perezosa efectivamente\n- [ ] 🧩 Trabajar con mónadas, functores y applicatives\n- [ ] 🚀 Desarrollar aplicaciones reales con Servant/Yesod\n- [ ] 🔍 Optimización, profiling y análisis de rendimiento\n- [ ] 🌐 Integración con ecosistemas externos (FFI, C bindings)\n\n---\n\n\u003e 💡 **Filosofía Haskell**: \"Si compila, probablemente funcione correctamente\". El sistema de tipos actúa como un asistente de pruebas que elimina entire clases de bugs en tiempo de compilación.\n\n**¡Bienvenido al mundo de la programación funcional pura!**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdieg0code%2Fhaskell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdieg0code%2Fhaskell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdieg0code%2Fhaskell/lists"}