Recorrido del robot
Los puntos de una retícula se representan mediante pares de enteros
| 1 |    type Punto = (Int,Int) | 
y los movimientos de un robot mediante el tipo
| 1 2 3 4 |    data Movimiento = N Int                    | S Int                    | E Int                    | O Int | 
donde (N x) significa que se mueve x unidades en la dirección norte y análogamente para las restantes direcciones (S es sur, E es este y O es oeste).
Definir la función
| 1 |    posicion :: [Movimiento] -> Punto | 
tal que (posicion ms) es la posición final de un robot que inicialmente está en el el punto (0,0) y realiza los movimientos ms. Por ejemplo,
| 1 2 3 4 5 6 |    posicion [N 3]                           ==  (0,3)    posicion [N 3, E 5]                      ==  (5,3)    posicion [N 3, E 5, S 1]                 ==  (5,2)    posicion [N 3, E 5, S 1, O 4]            ==  (1,2)    posicion [N 3, E 5, S 1, O 4, N 3]       ==  (1,5)    posicion [N 3, E 5, S 1, O 4, N 3, S 3]  ==  (1,2) | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | type Punto = (Int,Int) data Movimiento = N Int                 | S Int                 | E Int                 | O Int -- 1ª solución                 posicion :: [Movimiento] -> Punto posicion ms = aux ms (0,0)   where aux [] p = p         aux (N x:ms) (a,b) = aux ms (a,b+x)         aux (S x:ms) (a,b) = aux ms (a,b-x)         aux (E x:ms) (a,b) = aux ms (a+x,b)         aux (O x:ms) (a,b) = aux ms (a-x,b) -- 2ª solución posicion2 :: [Movimiento] -> Punto posicion2 []       = (0,0) posicion2 (N x:ms) = suma (0 ,x)  (posicion2 ms) posicion2 (S x:ms) = suma (0 ,-x) (posicion2 ms) posicion2 (E x:ms) = suma (x ,0)  (posicion2 ms) posicion2 (O x:ms) = suma (-x,0)  (posicion2 ms) suma :: Punto -> Punto -> Punto suma (x,y) (a,b) = (x+a,y+b) -- 3ª solución posicion3 :: [Movimiento] -> Punto posicion3 []     = (0,0) posicion3 (m:ms) = case m of                      N x -> (a,b+x)                      S x -> (a,b-x)                      E x -> (a+x,b)                      O x -> (a-x,b)   where (a,b) = posicion3 ms -- 4ª solución posicion4 :: [Movimiento] -> Punto posicion4 = foldl aux (0,0)   where     aux (x,y) (N j) = (x,y+j)     aux (x,y) (S j) = (x,y-j)     aux (x,y) (E i) = (x+i,y)     aux (x,y) (O i) = (x-i,y) --- 5ª solución posicion5 :: [Movimiento] -> Punto posicion5 xs = (sum hs, sum vs)   where     (hs,vs)   = unzip (map aux xs)     aux (N j) = (0,j)     aux (S j) = (0,-j)     aux (E i) = (i,0)     aux (O i) = (-i,0) |