Ejercicios
The Programmer’s Brain, Felienne Hermans
El Kata del semáforo
Considere un semáforo vehicular que tiene tres luces de colores Rojo, Verde y Amarillo. Estas luces se encienden durante un cierto número de segundos en un orden específico: 🔴 ➡ 🟡 ➡ 🟢 ➡ 🟡 ➡ 🔴. Además siempre hay una sola luz encendida (no es posible que haya varias luces encendidas al mismo tiempo). A modo de ejemplo, asuma que la luz roja permanece encendida durante 45 segundos, la luz amarilla durante 2 segundos, y la luz verde durante 66 segundos, y que inicialmente el semáforo se prende en rojo. En este ejercicio se propone escribir un conjunto de tipos y funciones que me permitan describir el estado del semáforo a un tiempo t dado en segundos (esto es, no interesa por el momento modelar la evolución real del sistema en el tiempo.)
- Como primer paso, defina un tipo de dato adecuado para describir el semáforo, y analice la conveniencia de definir un tipo de dato para el tiempo.
- Analice cuáles son las transiciones de los estados de las luces, y proponga la o las funciones que permitan cambiar de estado, y las modificaciones necesarias (o no) al tipo de dato que describe el semáforo.
- Escriba un tipo de dato que pueda resumir el estado del semáforo y las transiciones.
- En algunos casos, típicamente por la noche en lugares de poco tránsito, el semáforo enciende la luz amarilla en forma intermitente. Agrege este nuevo caso al modelo del problema, y modifique las funciones adecuadamente.
Números naturales
Continuando con el ejemplo que vimos en clase, donde se propone un tipo de dato para describir a los números naturales al estilo de Peano como:
type Peano =
| Zero
| Succ of Peano
Escriba funciones que permitan sumar y multiplicar dos números naturales definidos como Peano
.
Siguiendo con MyList
Usando el tipo de dato que vimos en clase
type MyList =
| Empty
| Cons of int * MyList
-
Escriba una función
length
que obtenga la longitud de la lista -
Escriba una función
rev
que reordene la lista desde el último elemento hasta el primero
let exampleList = Cons (1, Cons (2, Cons (3, Empty)))
// el resultado de rev exampleList debe ser
// Cons (3, Cons (2, Cons (1, Empty)))