Acá va el de Pirámides...
Ejercicio + Módulo (para bajar)
Ejercicio:
import Piramide
pirr = crearPir 4 [39,22,17,13,9,8,5,8,1,7]
bienFormada :: Piramide -> Bool
bienFormada pir = auxBF pir 1
fila :: Int -> Piramide -> [Int] --devuelve una [Int] con los valores de la n-esima fila.
fila n pir = auxFila n pir 1
auxFila :: Int -> Piramide -> Int -> [Int]
auxFila n pir i
| i == n = [valor pir n n]
| otherwise = (valor pir n i):(auxFila n pir (i+1))
filaDeArriba :: [Int] -> [Int] --dada una fila construye la que tendría que ser la que va arriba para que sea bien formada.
filaDeArriba f = auxFArr f 0
auxFArr :: [Int] -> Int -> [Int]
auxFArr f i
| i==((length f)-2) = [(f!!i)+(f!!(i+1))]
| otherwise = ((f!!i)+(f!!(i+1))):(auxFArr f (i+1))
auxBF :: Piramide -> Int -> Bool --Chequea desde la n-esima fila hasta la anteultima si son "la fila de arriba" de la de abajo.
auxBF p n
| n == (altura p) = True
| otherwise = (fila n p) == (filaDeArriba (fila (n+1) p)) && (auxBF p (n+1))
Módulo:
module Piramide (Piramide(..), altura, valor,crearPir)
where
data Piramide = Pir Int [Int]
altura :: Piramide -> Int
altura (Pir h _) = h
valor :: Piramide -> Int -> Int -> Int
valor (Pir h v) f c = v!!((auxIndFila f) + (c-1))
auxIndFila :: Int -> Int
auxIndFila 1 = 0
auxIndFila n = (n-1) + (auxIndFila (n-1))
crearPir :: Int -> [Int] -> Piramide
crearPir h v = Pir h v