Suma de posteriores
Definir la función
sumaPosteriores :: [Int] -> [Int]
tal que (sumaPosteriores xs) es la lista obtenida sustituyendo cada elemento de xs por la suma de los elementos posteriores. Por ejemplo,
sumaPosteriores [1..8] == [35,33,30,26,21,15,8,0] sumaPosteriores [1,-3,2,5,-8] == [-4,-1,-3,-8,0]
Comprobar con QuickCheck que el último elemento de la lista (sumaPosteriores xs) siempre es 0.
Soluciones
import Data.List (tails) import Test.QuickCheck -- 1ª definición (por recursión): sumaPosteriores1 :: [Int] -> [Int] sumaPosteriores1 [] = [] sumaPosteriores1 (x:xs) = sum xs : sumaPosteriores1 xs -- 2ª definición (sin argumentos) sumaPosteriores2 :: [Int] -> [Int] sumaPosteriores2 = map (sum . tail) . init . tails -- La propiedad es propSumaP:: [Int] -> Property propSumaP xs = not (null xs) ==> last (sumaPosteriores1 xs) == 0 -- La comprobación es -- λ> quickCheck propSumaP -- +++ OK, passed 100 tests.