División según una propiedad
Enunciado
Definir la función
1 |
divideSegun :: (a -> Bool) -> [a] -> [[a]] |
tal que (divideSegun p xs) es la lista de los segmentos de xs cuyos elementos no cumplen la propiedad p. Por ejemplo,
1 2 |
divideSegun even [3,5,2,7,6,8,9,1] == [[3,5],[7],[9,1]] divideSegun odd [3,5,2,7,6,8,9,1] == [[2],[6,8]] |
Comprobar con QuickCheck que, para cualquier lista xs de números enteros, la concatenación de los elementos de (divideSegun even xs) es la lista de los elementos de xs que no son pares.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import Test.QuickCheck divideSegun :: (a -> Bool) -> [a] -> [[a]] divideSegun p xs | null ys = [] | otherwise = ys : divideSegun p zs where (ys,zs) = break p (dropWhile p xs) -- La propiedad es prop_divideSegun :: [Int] -> Bool prop_divideSegun xs = concat (divideSegun even xs) == filter (not . even) xs -- La comprobación es -- ghci> quickCheck prop_divideSegun -- +++ OK, passed 100 tests. |
Con Data.List.Split y sus combinadores queda mas elegante