Particiones de una lista
Definir la función
1 |
particiones :: [a] -> [[[a]]] |
tal que (particiones xs) es la lista de las particiones de xs en segmentos de elementos consecutivos. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
λ> particiones [1..3] [[[1],[2],[3]],[[1],[2,3]],[[1,2],[3]],[[1,2,3]]] λ> mapM_ print (particiones "abcd") ["a","b","c","d"] ["a","b","cd"] ["a","bc","d"] ["a","bcd"] ["ab","c","d"] ["ab","cd"] ["abc","d"] ["abcd"] λ> length (particiones [1..22]) 2097152 |
Comprobar con QuickCheck que la concatenación de cada uno de los elementos de (particiones xs) es igual a xs.
Nota: En la comprobación usar ejemplos pequeños como se indica a continuación
1 |
quickCheckWith (stdArgs {maxSize=10}) prop_particiones |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import Test.QuickCheck particiones :: [a] -> [[[a]]] particiones [] = [[]] particiones xs = [(take k xs) : yss | k <- [1..n], yss <- particiones (drop k xs)] where n = length xs -- La propiedad es prop_particiones :: [Int] -> Bool prop_particiones xs = all (\yss -> concat yss == xs) (particiones xs) -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=10}) prop_particiones -- +++ OK, passed 100 tests. |
y la comprobación es: