En la lista circular [3,2,5,7,9]
- el vecino izquierdo de 5 es 2 y su vecino derecho es 7,
- el vecino izquierdo de 9 es 7 y su vecino derecho es 3,
- el vecino izquierdo de 3 es 9 y su vecino derecho es 2,
- el elemento 4 no tiene vecinos (porque no está en la lista).
Para indicar las direcciones se define el tipo de datos
data Direccion = I | D deriving Eq |
Definir la función
vecino :: Eq a => Direccion -> [a] -> a -> Maybe a |
tal que (vecino d xs x) es el vecino de x en la lista de elementos distintos xs según la dirección d. Por ejemplo,
vecino I [3,2,5,7,9] 5 == Just 2 vecino D [3,2,5,7,9] 5 == Just 7 vecino I [3,2,5,7,9] 9 == Just 7 vecino D [3,2,5,7,9] 9 == Just 3 vecino I [3,2,5,7,9] 3 == Just 9 vecino D [3,2,5,7,9] 3 == Just 2 vecino I [3,2,5,7,9] 4 == Nothing vecino D [3,2,5,7,9] 4 == Nothing |
Soluciones
data Direccion = I | D deriving Eq -- 1ª solución -- =========== vecino1 :: Eq a => Direccion -> [a] -> a -> Maybe a vecino1 d xs x = busca x (vecinos d xs) -- (vecinos d xs) es la lista de elementos de xs y sus vecinos según la -- direccioń d. Por ejemplo, -- vecinos I [1..5] == [(2,1),(3,2),(4,3),(5,4),(1,5)] -- vecinos D [1..5] == [(1,2),(2,3),(3,4),(4,5),(5,1)] vecinos :: Direccion -> [a] -> [(a,a)] vecinos I xs = zip (tail (cycle xs)) xs vecinos D xs = zip xs (tail (cycle xs)) -- (busca x ps) es el la segunda componente de primer par de ps cuya -- primera componente es igual a x. Por ejemplo, -- busca 3 [(4,1),(3,2),(3,7)] == Just 2 -- busca 7 [(4,1),(3,2),(3,7)] == Nothing busca :: Eq a => a -> [(a,b)] -> Maybe b busca x ps | null zs = Nothing | otherwise = Just (head zs) where zs = [z | (x',z) <- ps, x' == x] -- 2ª solución -- =========== vecino2 :: Eq a => Direccion -> [a] -> a -> Maybe a vecino2 d xs x = lookup x (vecinos d xs) -- 3ª solución -- =========== vecino3 :: Eq a => Direccion -> [a] -> a -> Maybe a vecino3 I xs x = lookup x (zip (tail (cycle xs)) xs) vecino3 D xs x = lookup x (zip xs (tail (cycle xs))) |
10 Comments