Probar tus ejercicios en el track de Haskell

Aprende a probar tus ejercicios de Haskell en Exercism


Ejecutar los tests

Ejecuta el siguiente comando en el directorio de tu ejercicio para ejecutar los tests:

stack test

Para ejecutar los tests cada vez que guardes un fichero, usa este otro comando:

stack test --file-watch

Si obtienes un mensaje de error como este...

No .cabal file found in directory

Es probable que estés usando una versión antigua de stack y necesites actualizarla.

En caso contrario, si obtienes un mensaje de error como este...

No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...

Haz lo que dice y descargará e instalará la versión correcta del compilador:

stack setup

Resolver el ejercicio

La solución de un ejercicio es un módulo de Haskell. El nombre del módulo se define en una instrucción import de la suite de tests, normalmente al principio:

import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)

import ModuleName (someFunc)

main :: IO ()
main ...

En este ejemplo, el fichero de tests importa, en la línea 4, un módulo llamado ModuleName, que exporta una función llamada someFunc. Esto significa que tienes que crear un fichero llamado ModuleName.hs que sea algo así:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Encontrarás un fichero con este nombre ya en src/, que puedes usar como punto de partida para tu solución.

Ten en cuenta que este stub está ahí únicamente para que puedas empezar. No dudes en cambiarlo por completo si crees que es lo correcto.

Usar paquetes

Si quieres usar algunos paquetes para escribir una solución más elegante, primero añade los paquetes a las dependencias de tu solución en package.yaml:

library:
  exposed-modules: ModuleName
  source-dirs: src
  dependencies:
    - foo
    - bar

Mientras trabajas en local, puedes usar los paquetes que quieras. El test runner en línea, sin embargo, solo tiene acceso a un conjunto limitado de paquetes. Los paquetes disponibles son

  • los que vienen preinstalados con GHC (en particular base, containers, array, time, mtl, deepseq, exceptions, bytestring), más
  • los precompilados para el test runner, que se enumeran en haskell-test-runner/pre-compiled/package.yaml.

Si envías una solución que usa un paquete que no está disponible, el test runner se topará con su falta de acceso a internet y mostrará un error como este:

Cabal file info not found for unavailable-package-1.0@..., updating
Selected mirror https://hackage.haskell.org/
Downloading root
HttpExceptionRequest Request {
  host                 = "hackage.haskell.org"
  ...
}
 (ConnectionFailure ...)

Ejecutar GHCi

Si quieres experimentar con tu solución en GHCi, ejecuta este comando:

stack ghci

HLint (opcional)

Te recomendamos encarecidamente que ejecutes hlint sobre tu solución para ver si detecta algo que se te ha pasado:

hlint ModuleName.hs

No tienes que aceptar todas las sugerencias que te dé hlint, pero normalmente te ayudarán a aprender a escribir código Haskell bonito e idiomático.