Cómo probar en el track de Haskell

Aprende a probar tus ejercicios de Haskell en Exercism


Ejecutar las pruebas

Ejecuta el siguiente comando en el directorio de tu ejercicio para ejecutar las pruebas:

stack test

Para ejecutar las pruebas cada vez que guardes un archivo, usa este comando en su lugar:

stack test --file-watch

Si recibes un mensaje de error como este...

No .cabal file found in directory

Probablemente estés usando una versión antigua de stack y tengas que actualizarla.

De lo contrario, si recibes un mensaje de error como este...

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

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

stack setup

Cómo resolver el ejercicio

Una solución a un ejercicio es un módulo de Haskell. El nombre del módulo se define en una sentencia import en el conjunto de pruebas, 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 archivo de pruebas 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 archivo llamado ModuleName.hs que sería algo como esto:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

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

Solo ten en cuenta que este stub está ahí únicamente para que puedas empezar. Siéntete libre de 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 agrega los paquetes a las dependencias de tu solución en package.yaml:

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

Mientras trabajas de forma local, puedes usar los paquetes que quieras. Sin embargo, el ejecutor de pruebas en línea solo tiene acceso a un conjunto limitado de paquetes. Los paquetes disponibles son

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

Si envías una solución que usa un paquete que no está disponible, el ejecutor de pruebas se topará con su falta de acceso a internet y producirá 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, solo ejecuta el comando:

stack ghci

HLint (opcional)

Se recomienda mucho que ejecutes hlint en tu solución para ver si detecta algo que se te esté pasando:

hlint ModuleName.hs

No tienes que aceptar todas las sugerencias que te da hlint, pero por lo general te ayudarán a aprender a escribir código Haskell hermoso e idiomático.