import Char -- EJERCICIO 1 -- f1 :: Int -> Char -> Bool f1 x y = chr x == y -- f2 :: [Int] -> [a] -> [Int] f2 x y = [length y] ++ x -- f3 :: Ord a => (a,b) -> a -> Bool f3 x y = fst x > y -- f4 :: [a] -> ([a] -> a) -> [a] f4 x y = y x : x -- EJERCICIO 2 type Punto = (Float, Float) distancia :: Punto -> Punto -> Float -- distancia p p’es la distancia del punto p al punto p’ distancia (x1,y1) (x2,y2) = sqrt ((x2-x1)^2 + (y2-y1)^2) type Centro = Punto type Radio = Float type CirculoP = (Centro, Radio) dentro :: Punto -> CirculoP -> Bool -- dentro p c decide si el punto p está dentro del círculo c dentro (x,y) ((u,v),r) = (distancia (u,v) (x,y)) <= r -- contiene :: CirculoP -> CirculoP -> Bool -- contiene c c’ decide si el círculo c' está entero dentro de c contiene ((u,v),r1) ((x,y),r2) = (distancia (x,y) (u,v) + r2) <= r1 -- EJERCICIO 3 infix :/ data Racional = Int :/ Int instance Show Racional where show (x :/ y) = show x ++ "/" ++ show y instance Eq Racional where (x :/ y) == (u :/ v) = x*v == y*u -- EJERCICIO 4 type Fecha = (Int, Int, Int) -- edad (da,ma,aa) (dn,mn,an) = aa - an + r - 1 -- where r = fromEnum ((ma,da) >= (mn,dn)) edad (da,ma,aa) (dn,mn,an) = if (ma,da) >= (mn,dn) then aa - an else aa - an - 1 data Mes = Enero | Febrero | Marzo | Abril | Mayo | Junio | Julio | Agosto | Septiembre | Octubre | Noviembre | Diciembre deriving (Show,Enum) showFecha (d,m,a) = show d ++ " de " ++ show mes ++ " de " ++ show a where mes = toEnum (m-1) :: Mes -- EJERCICIO 5 -- (=#=):: Float -> Float -> Bool -- x =#= y es True sii x e y se diferencian en menos de -- una millonésima. infix 5 =#= (=#=) :: Double -> Double -> Bool x =#= y = abs(x-y) < 1.0e-6 eq_aprox:: Int -> Double -> Double -> Bool -- eq_aprox n x y es True sii x e y se diferencian en menos -- de 1/10n eq_aprox n x y = abs(x-y) < recip (10^n) infix 5 =?= (=?=):: Double -> Double -> Bool -- x =?= y sii x e y se diferencian en menos de -- una diez-millonésima. x =?= y = eq_aprox 7 x y