División según una propiedad
Definir la función
divideSegun :: (a -> Bool) -> [a] -> [[a]]
tal que (divideSegun p xs) es la lista de los segmentos de xs cuyos elementos cumplen la propiedad p. Por ejemplo,
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
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 -- λ> quickCheck prop_divideSegun -- +++ OK, passed 100 tests.