Laboratorio de Haskell: programación funcional con funciones y tipos, en el navegador

Este laboratorio da a cada estudiante un compilador de Haskell propio, con cuatro archivos pequeños para leer, ejecutar y cambiar: funciones y tipos, listas, pliegues y recursión, y un tipo propio. Un programa Haskell se compone de funciones que reciben valores y devuelven valores, y cada función tiene un tipo que el compilador comprueba antes de que se ejecute nada.

No es un laboratorio de ataque. Cada copia no tiene ninguna ruta hacia internet ni hacia otro estudiante, así que no se puede descargar nada en ella y nada de lo que hay dentro puede llegar a otra persona. Tiene solo el compilador y las bibliotecas que lo acompañan: no se pueden instalar paquetes adicionales, así que no hay cabal install ni stack.

Qué aprende el alumnado

Que un programa puede construirse con funciones, y que un tipo dice lo que cada una recibe y devuelve. Los estudiantes leen una firma de tipo, ejecutan un archivo, calculan una expresión, aplican map y filter a una lista, escriben una función que se llama a sí misma y ven a un pliegue hacer el mismo trabajo, y se encuentran con un error de tipos que detiene un programa antes de ejecutarlo. Un cuarto archivo añade un tipo propio con dos formas y una función que lo desmonta según cuál sea la forma. Sirve para una introducción a los paradigmas de programación; compruebe en la unidad de su propio organismo la redacción exacta, aquí no se cita ninguna.

Ejecútalo en tu navegador

El laboratorio arranca un servicio, haskell, con la imagen oficial haskell, como una cuenta sin privilegios. No hay página web, así que la barra del laboratorio no tiene enlace bajo En tu navegador, y el terminal es la forma de ejecutar código. Llega al compilador con docker exec haskell, seguido de runghc y un nombre de archivo para ejecutar un archivo, o de ghc -e y una expresión entre comillas para calcular una expresión. El compilador tarda un par de segundos en arrancar cada vez. Cada respuesta es igual cada vez, y todo lo que se imprime está en inglés, sea cual sea el idioma de la página.

Para conversar con el compilador, pulse Abrir terminal y escriba docker exec -it haskell ghci Lists.hs. En el indicador ghci> escriba una expresión y pulse Intro, como map (* 2) [1, 2, 3], que imprime [2,4,6]. Escriba :t seguido de un nombre para ver su tipo, y :quit para salir.

  1. Abre la página Contenedor. Abre «Crear» en la barra y elige «Ejecutar un contenedor». Cualquiera puede abrir la página, y el laboratorio de Git y el de SQL se inician sin cuenta. Todos los demás laboratorios necesitan una cuenta gratuita: crea una, inicia sesión y pulsa «Iniciar».
  2. Busca el laboratorio. La tarjeta «Laboratorios de ejemplo» lista todos los ejemplos. Busca Haskell: funciones, tipos y listas.
  3. Pulsa «Iniciar». «Iniciar» lo ejecuta tal cual, con una sola pulsación. «Editar el archivo primero» abre el archivo compose para que lo cambies antes de iniciarlo.
  4. Ábrelo. No hay ninguna página web que abrir. En la página del laboratorio pulse Abrir terminal y escriba docker exec haskell runghc Basics.hs para ejecutar el primer archivo: imprime Hello, Haskell!, luego 49 y luego (True,False).

Qué pedir que entreguen

Las expresiones que probaron y lo que imprimió cada una: una que llame a una función de un archivo, una que use map o filter con una lista y una que haga que el compilador señale un error de tipos. Después una función propia añadida a Basics.hs con su firma de tipo y una llamada que la muestre funcionando, y una o dos frases con sus palabras sobre lo que dice una firma de tipo al lector. Nada se corrige automáticamente: la función y la frase muestran si se entendió. Para un trabajo más sólido, pida que escriban primero la firma y digan qué promete.

Una lección básica en este laboratorio

Haskell Basics es una lección pequeña que se hace en este laboratorio. En ella el estudiante lee una función y su tipo, ejecuta un archivo, aplica una función a una lista, pliega una lista y se encuentra con un error de tipos.

Las cuentas personales gratuitas la tienen en el módulo Basics, que está en Inicio, y cada centro puede copiarla desde la carpeta Basics de la Biblioteca. Es pequeña a propósito: muestra a un docente qué es una lección trabajada en un laboratorio, y el laboratorio hace el resto. Cópiala en un módulo tuyo para cambiarla.

El código en GitHub

El archivo compose no tiene Dockerfile: ejecuta una sola imagen pública oficial, Haskell con GHC, fijada en la versión 9.10.1, como una cuenta sin privilegios con 384 MB de memoria. GHC es el que más consume: ejecutar un archivo, una expresión suelta, el indicador interactivo y una compilación completa de un archivo como estos llegó cerca de 250 MB contando la caché de los archivos del propio compilador, y el mismo trabajo terminó dentro de 192 MB, así que 384 MB dejan margen. La imagen y el compilador tienen licencias de código abierto permisivas y no los distribuimos nosotros. El archivo escribe cuatro archivos didácticos pequeños la primera vez que arranca y los guarda en un volumen, así que lo que el estudiante cambia sigue ahí tras una parada y un arranque. Los límites son honestos: no hay salida, así que no hay paquetes adicionales, y un programa muy grande puede necesitar más memoria de la que tiene el laboratorio.

Asignarlo como trabajo

Indica en la tarea qué hay que entregar.

  1. Crea el laboratorio. En tu módulo añade una tarea y elige la tarjeta «Laboratorio de contenedores», y después «En un repositorio de GitHub». Indica https://github.com/mitsurutech/lab-haskell-lab con la rama main. El archivo compose es el predeterminado, compose.yaml. Haz un fork del repositorio antes si quieres modificarlo, por ejemplo para añadir más funciones a los archivos de partida.
  2. Publica y pruébalo. «Publicar» fija el commit que te mostraron, así que un cambio posterior en el repositorio no altera un laboratorio que ya has asignado. Inicia primero tu propia copia.
  3. Asígnalo. Asígnalo como cualquier tarea, con una fecha de entrega si quieres, e indica en la tarea qué hacer y qué entregar.
  4. Califica lo entregado. Abre la copia de un alumno y el trabajo que ha entregado, califícalo y devuélvelo con un motivo si necesita más.

Prueba este laboratorio, y lo que cuesta

Con una cuenta personal gratuita puedes seguir las lecciones básicas de este laboratorio, con crédito gratuito suficiente cada mes para seguir la mayoría de las lecciones y sin tarjeta. Para una clase, un centro tiene gratis sus primeros 365 días, hasta 50 alumnos, y después paga por alumno y año, con todos los laboratorios incluidos y el profesorado gratis.

Preguntas frecuentes

¿Por qué es lenta la primera orden?
El compilador tiene que arrancar y leer sus bibliotecas cada vez, lo que tarda un par de segundos. Ejecutar un archivo con runghc o una expresión con ghc -e lo hace cada vez. Para muchos intentos seguidos use el indicador interactivo, ghci, que arranca una sola vez.
¿Por qué los nombres y los mensajes siguen en inglés en una página en otro idioma?
El saludo de los archivos, las palabras Just y Nothing y todos los mensajes del compilador están en inglés, y el laboratorio no los cambia. La lección lo dice y explica cada respuesta en el idioma de la página.
¿Pueden los estudiantes instalar un paquete?
No. El laboratorio no tiene salida a internet, así que no se puede descargar nada: solo están las bibliotecas que vienen con el compilador. Cualquier cosa de esas bibliotecas, como Data.Char, se puede importar.