Divide si todos son múltiplos
Ejercicio. Definir la función
1 |
divideSiTodosMultiplos :: Integral a => a -> [a] -> Maybe [a] |
tal que (divideSiTodosMultiplos x ys) es justo la lista de los cocientes de los elementos de ys entre x si todos son múltiplos de x y Nothing en caso contrario. Por ejemplo,
1 2 |
divideSiTodosMultiplos 2 [6,10,4] == Just [3,5,2] divideSiTodosMultiplos 2 [6,10,5] == Nothing |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-- 1ª definición (por comprensión) divideSiTodosMultiplos :: Integral a => a -> [a] -> Maybe [a] divideSiTodosMultiplos x ys | todosMultiplos x ys = Just [y `div` x | y <- ys] | otherwise = Nothing -- (todosMultiplos x ys) se verifica si todos los elementos de ys son -- múltiplos de x. Por ejemplo, -- todosMultiplos 2 [6,10,4] == True -- todosMultiplos 2 [6,10,5] == False todosMultiplos :: Integral a => a -> [a] -> Bool todosMultiplos x ys = and [y `mod` x == 0 | y <- ys] -- 2ª definición (por recursión) divideSiTodosMultiplos2 :: Integral a => a -> [a] -> Maybe [a] divideSiTodosMultiplos2 _ [] = Just [] divideSiTodosMultiplos2 x (y:ys) | y `mod` x /= 0 = Nothing | aux == Nothing = Nothing | otherwise = Just ((y `div` x) : zs) where aux = divideSiTodosMultiplos2 x ys Just zs = aux |
Un comentario