Howto: debugger Haskell (hdb) en IntelliJ Ultimate paso a paso


5 de mayo de 2026

Para quien es esto

Quieres pausar codigo Haskell en IntelliJ IDEA Ultimate (la version de pago de JetBrains, la que usas para PHP/Java/Python), ver tus thunks expandirse en el panel de variables, y hacer step over en codigo perezoso. Esta guia te lleva del cero a tu primer breakpoint.

Si quieres entender POR QUE esto importa o leer el diario de batalla con todas las trampas, mira mi otro post: Hito doble: Haskell con debugger en Doom y en IntelliJ.

Aqui solo pasos. Resultado al final:

Lo que vamos a montar: =hdb= compilando dentro del flake, parando en breakpoint, expandiendo el thunk en el panel de variables.

Requisitos

Paso 1: Instalar LSP4IJ

LSP4IJ es el plugin de Red Hat que añade soporte LSP/DAP user-defined en IntelliJ.

  1. Settings → Plugins → Marketplace.
  2. Buscar LSP4IJ.
  3. Install. Restart IDE.

(Opcional pero muy recomendado: instalar tambien el plugin Haskell LSP de Rockofox. NO lo vamos a usar para HLS — porque HLS no soporta GHC 9.14 todavia — pero registra automaticamente el fileType "Haskell language file" que LSP4IJ necesita. Es free.)

Paso 2: Asegurar el fileType Haskell

LSP4IJ envia los breakpoints al adapter solo si IntelliJ reconoce .hs como un fileType. Hay dos vias:

Via A: Tienes el plugin Haskell LSP instalado

Listo, no haces nada. El plugin registra "Haskell language file" para *.hs y *.lhs. Comprueba abriendo un fichero .hs: el icono del tab debe ser una lambda, no texto plano. Si sale lambda, salta al paso 3.

Via B: Sin plugin, registrar el fileType a mano

Settings → Editor → File Types → boton "+" arriba para añadir. Rellena:

Settings - Editor - File Types con Haskell siendo creado
Crear el fileType Haskell con sus comentarios y pareados.

Selecciona "Haskell" en la lista. Abajo en "File name patterns", pulsa "" y añade *.hs. Pulsa "" otra vez y añade *.lhs. Apply.

(Si IntelliJ te avisa "This wildcard is already registered by 'Haskell language file' filetype", cancela tu fileType custom: ya tienes uno via plugin. Esa via es la A.)

Diálogo: el wildcard ya está registrado por Haskell language file
Si te aparece este popup, ya tienes fileType Haskell. Cancela y usa el existente.

Paso 3: Crear el Run/Debug DAP Configuration

3.1 Abrir el editor

Settings → Other Settings → Debug Adapter Protocol → boton "+" para añadir un template nuevo. Te ofrece varias pestañas: Server, Mappings, Configuration, Installer.

3.2 Server tab

3.3 Mappings tab

Activa el sub-tab **"File type"** y añade una entrada:

Mappings tab con File type Haskell + language id haskell
Mapping File type → Haskell, language id haskell.

(Tambien puedes añadir un mapping en "File name patterns" con *.hs y *.lhs por si acaso, pero con el File type ya basta.)

3.4 Configuration tab

3.5 Apply, OK

Cierra el dialogo entero. Te queda una Run/Debug Configuration nueva en la dropdown del IDE.

Paso 4: Persistir la config en el repo (recomendado)

Por defecto, la config se guarda en tu IntelliJ local. Para que cualquier persona que clone tu repo herede la misma config:

  1. Abre la dropdown de Run/Debug Configurations → Edit Configurations.
  2. Selecciona tu "Haskell hdb".
  3. Marca el checkbox **"Store as project file"**.
  4. Apply, OK.

IntelliJ guarda la config en .idea/runConfigurations/<nombre>.xml. Commitea ese fichero al repo:

cd ~/src/tu-proyecto-haskell
git add -f .idea/runConfigurations/Haskell-hdb.xml
git commit -m "feat(.idea): persistir DAP Configuration para hdb"

(-f si tu gitignore global excluye .idea/.)

Paso 5: Tu primer breakpoint

  1. Abre tu fichero .hs en el editor.
  2. Verifica que el icono del tab tiene la lambda Haskell, no texto plano. Si no, vuelve al paso 2.
  3. Pon breakpoint clicando en el margen izquierdo. Sale circulo rojo.
  4. MUY IMPORTANTE: pulsa el boton DEBUG (icono escarabajo verde 🐞), NO el boton Run (▶ triangulo verde). Si pulsas Run, IntelliJ envia noDebug:true al adapter y el programa corre sin pausar. Atajo: Shift+F9 = Debug. Shift+F10 = Run, NO uses ese.
  5. Espera 15-25 segundos en el primer arranque. Veras en la consola los logs de hie-bios descubriendo flags y hdb compilando el modulo.
  6. Cuando para en el breakpoint, abrese el panel de Debug abajo con pestañas Variables, Frames, Console.
IntelliJ Ultimate pausado en breakpoint con thunks visibles
Breakpoint hit. Panel Variables muestra =primerosCincoParesAlCuadrado = {[Int]} _=. El guion bajo es un thunk SIN EVALUAR. F8 (step over) y se transforma en =[4,16,36,64,100]=.

Atajos de teclado utiles

Atajo Que hace
Shift+F9 Debug (con breakpoints activos)
Shift+F10 Run (SIN debugger — no usar)
F9 Resume program
F8 Step over (siguiente linea)
F7 Step into (entra en funcion)
Shift+F8 Step out (sale a la llamada)
Ctrl+F8 Toggle breakpoint en linea actual
Ctrl+Shift+F8 Ver/editar todos los breakpoints

Lo que no esperar

Cierre

Con esto pausas codigo Haskell en IntelliJ Ultimate, inspeccionas thunks y haces stepping. La intuicion de lazy evaluation que antes solo se ganaba leyendo libros, ahora se ve en pantalla.

El howto equivalente para Doom Emacs esta aqui: Howto Doom Emacs + hdb.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario