All pastes #193147 Raw Edit

Something

public python v1 · immutable
·published 2006-10-06 16:46 UTC
rendered paste body
module Fecha (Fecha,              nuevaFe,              diaFe,              mesFe,              anioFe,              sumaFe,              diasEntreFe) wheredata Fecha = Fec Int deriving(Eq, Ord)instance Show Fecha 	where show f = show (diaFe f) ++ "/" ++ show (mesFe f) ++ "/" ++ show (anioFe f)------------------------- Funciones pedidas -------------------------nuevaFe :: Int -> Int -> Int -> FechanuevaFe dia mes anio = Fec (diasDesdeCero dia mes anio)anioFe :: Fecha -> IntanioFe (Fec d) = obtenerElAnio dmesFe :: Fecha -> IntmesFe (Fec d) = obtenerElMes (obtenerDiasSobrantesAnio d) (obtenerElAnio d)diaFe (Fec d) = obtenerDiasSobrantesMes (obtenerDiasSobrantesAnio d) (obtenerElAnio d)sumaFe :: Fecha -> Int -> Fecha sumaFe (Fec f) d = Fec (f+d) diasEntreFe :: Fecha -> Fecha -> IntdiasEntreFe (Fec f1) (Fec f2) = f2 - f1------------------ Auxiliares -------------------- devuelve el numero de dia desde el 1/1/0001diasDesdeCero :: Int -> Int -> Int -> IntdiasDesdeCero d m a = diasHastaElAnio a + diasHastaElMes m a + d-- devuelve la cantidad de dias hasta el comienzo del anio desde 1/1/0001diasHastaElAnio :: Int -> IntdiasHastaElAnio a | a > 0 = auxDiasHastaElAnio a 1auxDiasHastaElAnio :: Int -> Int -> IntauxDiasHastaElAnio a c | a == c = 0                        | esBisiesto a = 366 + auxDiasHastaElAnio a (c + 1)                       | otherwise = 365 + auxDiasHastaElAnio a (c + 1)-- devuelve los dias desde el comienzo del anio hasta el mes indicadodiasHastaElMes :: Int -> Int -> IntdiasHastaElMes m a | m > 0 && a > 0 = auxDiasHastaElMes m a 1auxDiasHastaElMes :: Int -> Int -> Int -> IntauxDiasHastaElMes m a c | c == m = 0auxDiasHastaElMes m a c | c < m && esMesDeTreinta c = 30 + auxDiasHastaElMes m a (c + 1)                        | c < m && esMesDeTreintaYUno c = 31 + auxDiasHastaElMes m a (c + 1)                        | c < m && m == 2 && esBisiesto a = 29 + auxDiasHastaElMes m a (c + 1)                        | c == 2 && not (esBisiesto a) = 28 + auxDiasHastaElMes m a (c + 1)esBisiesto a = (a `mod` 4 == 0 && a `mod` 100 /= 0 ) || (a `mod` 400 == 0)-- TODO: se puede usar `elem`?esMesDeTreinta m = m `elem` [4,6,9,11]-- TODO: se puede usar `elem`?esMesDeTreintaYUno m = m `elem` [1,3,5,7,8,10,12]-- devuelve la maxima cantidad posible de anios que se le-- le puede restar a la cantidad de dias indicadaobtenerElAnio :: Int -> IntobtenerElAnio d | d > 0 = auxObtenerElAnio d 1auxObtenerElAnio :: Int -> Int -> IntauxObtenerElAnio d c | d < 366 && esBisiesto c = c                     | d < 365 = c                     | not (esBisiesto c) = auxObtenerElAnio (d-365) (c+1)                     | esBisiesto c =  auxObtenerElAnio (d-366) (c+1) -- devuelve el resto en dias despues de restar la mayor-- cantidad posible de aniosobtenerDiasSobrantesAnio :: Int -> IntobtenerDiasSobrantesAnio d | d > 0 = auxObtenerDiasSobrantesAnio d 1auxObtenerDiasSobrantesAnio :: Int -> Int -> IntauxObtenerDiasSobrantesAnio d c | d < 366 && esBisiesto c = d                                | d  < 365 = d                                | not (esBisiesto c) =  auxObtenerDiasSobrantesAnio (d-365) (c+1)                                | esBisiesto c =  auxObtenerDiasSobrantesAnio (d-366) (c+1) -- analogo a obtenerElAnio pero con el numero de dia dentro de un anioobtenerElMes :: Int -> Int -> IntobtenerElMes d a | d > 0 && a > 0 = auxObtenerElMes d a 1auxObtenerElMes :: Int -> Int -> Int -> IntauxObtenerElMes d a c | d <= 31 && esMesDeTreintaYUno c = c                      | d <= 30 && esMesDeTreinta c = c                      | d <= 29 && c == 2 && esBisiesto a = c                      | d <= 28 && c == 2 && not (esBisiesto a) = c                      | esMesDeTreintaYUno c = auxObtenerElMes (d - 31) a (c + 1)                      | esMesDeTreinta c = auxObtenerElMes (d - 30) a (c + 1)                      | c == 2 && esBisiesto a = auxObtenerElMes (d - 29) a (c + 1)                      | c == 2 && not (esBisiesto a) = auxObtenerElMes (d - 28) a (c + 1)-- analogo a obtenerDiasSobrantesAnio pero con el numero de dia dentro de un anioobtenerDiasSobrantesMes :: Int -> Int -> IntobtenerDiasSobrantesMes d a | d > 0 && a > 0 = auxObtenerDiasSobrantesMes d a 1auxObtenerDiasSobrantesMes :: Int -> Int -> Int -> IntauxObtenerDiasSobrantesMes d a c | d <= 31 && esMesDeTreintaYUno c = d                                 | d <= 30 && esMesDeTreinta c = d                                 | d <= 29 && c == 2 && esBisiesto a = d                                 | d <= 28 && c == 2 && not (esBisiesto a) = d                                 | esMesDeTreintaYUno c = auxObtenerDiasSobrantesMes (d - 31) a (c + 1)                                 | esMesDeTreinta c = auxObtenerDiasSobrantesMes (d - 30) a (c + 1)                                 | c == 2 && esBisiesto a = auxObtenerDiasSobrantesMes (d - 29) a (c + 1)                                 | c == 2 && not (esBisiesto a) = auxObtenerDiasSobrantesMes (d - 28) a (c + 1)