Advertisement
tomasfdel

ALP Práctica 5

Nov 15th, 2018
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- EJERCICIO 1
  2. data Pair a = P (a,a)
  3.  
  4. instance Functor Pair where
  5.     fmap f (P (x,y)) = P (f x, f y)
  6. {-
  7. 1- fmap id (P (x, y)) = P (id x, id y) = P (x, y)
  8. 2- fmap f (fmap g (P (x,y))) = fmap f (P (g x, gy)) = P (f (g x), f (g y)) = fmap (f o g) (P (x, y))
  9. -}
  10.  
  11. data Tree a = Empty | Branch a (Tree a) (Tree a)
  12.  
  13. instance Functor Tree where
  14.     fmap f Empty = Empty
  15.     fmap f (Branch x l r) = Branch (f x) (fmap f l) (fmap f r)
  16. {-
  17. 1- fmap id Empty = Empty
  18.    fmap id (Branch x l r) = Branch (id x) (fmap id l) (fmap id r) = Branch x l r
  19. 2- fmap f (fmap g Empty) = fmap f Empty = Empty = fmap (f o g) Empty
  20.    fmap f (fmap g (Branch x l r)) = fmap f (Branch (g x) (fmap g l) (fmap g r)) =
  21.  = Branch (f (g x)) (fmap f (fmap g l)) (fmap f (fmap g r)) =
  22.  = Branch ((f o g) x) (fmap (f o g) l) (fmap (f o g) r) = fmap (f o g) (Branch x l r)
  23. -}
  24.  
  25. data GenTree a = Gen a [GenTree a]
  26.  
  27. instance Functor GenTree where
  28.     fmap f (Gen x xs) = Gen (f x) (map (fmap f) xs)
  29. {-
  30. 1- fmap id (Gen x xs) = Gen (id x) (map (fmap id) xs) = Gen x xs
  31. 2- fmap f (fmap g (Gen x xs)) = fmap f (Gen (g x) (map (fmap g) xs)) =
  32.  = Gen (f (g x)) (map (fmap f) (map (fmap g) xs)) =
  33.  = Gen ((f o g) x) (map (fmap f)) o (map (fmap g)) xs) =
  34.  = Gen ((f o g) x) (map ((fmap f) o (fmap g)) xs) =
  35.  = Gen ((f o g) x) (map (fmap (f o g)) xs) =
  36.  = fmap (f o g) (Gen x xs)
  37. -}
  38.  
  39. data Cont a = C ((a -> Int) -> Int)
  40.  
  41. instance Functor Cont where
  42.     fmap f (C g) = C (\f1 -> g (\a -> f1 (f a)))
  43.  
  44. {-
  45. 1- fmap id (C g) = C (\f1 -> g (\a -> f1 (id a))) = C (\f1 -> g (\a -> f1 a)) =
  46.  = C (\f1 -> g f1) = C g
  47. 2- fmap f (fmap g (C h)) = fmap f (C (\f1 -> h (\a -> f1 (g a)))) =
  48.  = C (\f1 -> (\f1 -> h (\a -> f1 (g a))) (\a -> f1 (f a))) =
  49.  = C (\f1 -> h (\a -> (\a -> f1 (f a)) (g a))) =
  50.  = C (\f1 -> h (\a -> f1 (f (g a)))) = C (\f1 -> h (\a -> f1 ((f o g) a))) =
  51.  = fmap (f o g) (C h)
  52. -}
  53.  
  54.  
  55. -- EJERCICIO 2
  56. a) fmap id (Func f) = Func id
  57.    Si f != id, functor.1 no se preserva
  58.  
  59. b) fmap id (B x (y, z)) = B x (id z, id y) = B x (z, y)
  60.    Si z != y, functor.1 no se preserva
  61.  
  62.  
  63. -- EJERCICIO 3
  64. g :: String -> A Int
  65. g "x" = Var 1
  66. g "y" = Res (Var 3) (Var 1)
  67. g "z" = Mul (Var 2) (Var 2)
  68. g _ = Num n
  69.  
  70. -- Se puede reemplazar n con cualquier entero, por lo que hay infinitas soluciones.
  71. -- La ecuación de h no tiene soluciones pues no existe forma de reemplazar (Mul _ _) por (Res _ _)
  72. -- con ninguna función, según las reglas de bind.
  73.  
  74.  
  75. -- EJERCICIO 4
  76. t = IfBoton (\b -> if b then t2 else t)
  77. t2 = IfBoton (\b -> if b then Beep (t) else t2)
  78.  
  79.  
  80. -- EJERCICIO 5
  81. t1 lee un caracter, lo imprime dos veces y se reproduce de nuevo.
  82. t2 lee un caracter, lo imprime entre paréntesis y se reproduce de nuevo.
  83. t3 imprime un paréntesis abierto, lee un caracter, lo imprime junto con un paréntesis cerrado y se reproduce de nuevo.
  84. t4 lee, y lee, y lee, y sigue leyendo.
  85.  
  86.  
  87. -- EJERCICIO 6
  88. writeChar :: Char -> ES ()
  89. writeChar = \c -> Write c (Var ())
  90.  
  91. readChar :: ES Char
  92. readChar = Read (\c -> Var c)
  93.  
  94. writeStr :: String -> ES()
  95. writeStr [] = Var ()
  96. writeStr (x:xs) = (writeChar x) >>= (\_ -> writeStr xs)
  97.  
  98.  
  99. -- EJERCICIO 7
  100. f = readLine. Lee una secuencia de caracteres hasta que se apriete Enter y devuelve una Variable con una lista de los valores leídos.
  101.  
  102.  
  103. -- EJERCICIO 8
  104. instance Monad m => Functor m where
  105.     fmap f a = a >>= (\x -> return (f x))
  106.  
  107. {-
  108. 1- fmap id a =
  109.  = a >>= (\x -> return (id x)) =
  110.  = a >>= (\x -> return x) =
  111.  = a >>= return = a
  112.  
  113. 2- fmap f (fmap g a) =
  114.  = fmap f (a >>= (\x -> return (g x))) =
  115.  = (a >>= (\x -> return (g x))) >>= (\x -> return (f x)) =
  116.  = a >>= (\y -> (\x -> return (g x)) y >>= (\x -> return (f x))) =
  117.  = a >>= (\y -> return (g y) >>= (\x -> return (f x))) =
  118.  = a >>= (\y -> return (f (g y))) =
  119.  = a >>= (\y -> return ((f o g) y)) =
  120.  = fmap (f o g) a
  121. -}
  122.  
  123. -- EJERCICIO 9
  124. mapM :: Monad m => (a -> m b) -> [a] -> m [b]
  125. mapM f [] = return []
  126. mapM f (x:xs) = (f x) >>= (\hd -> (mapM f xs) >>= (\tl -> return (hd:tl)))
  127.  
  128. foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
  129. foldM f base [] = return base
  130. foldM f base (x:xs) = (f base x) >>= (\a -> foldM f a xs)
  131.  
  132.  
  133. -- EJERCICIO 10
  134. do z <- (do y <- (do x <- m
  135.                      h x)
  136.             f y)
  137.    return (g z)
  138.  
  139.  
  140. -- EJERCICIO 11
  141. (y >>= \z -> f z >>= \w -> return (g w z)) >>=
  142.    \x -> (h x 3) >>= \y -> if y then return 7
  143.                                 else (h x 2) >>= \z -> return (k z)
  144.  
  145.  
  146. -- EJERCICIO 12
  147. do y <- return x
  148.    f y                =   f x
  149.  
  150. do y <- t
  151.    return y           =   t
  152.  
  153. do y <- (do z <- t        do z <- t
  154.             f t)             y <- f z
  155.    g y                =      g y
  156.  
  157.  
  158. -- EJERCICIO 13
  159. main :: IO()
  160. main = putStrLn "Hola mundo!"
  161.  
  162.  
  163. -- EJERCICIO 14
  164. import System.IO
  165.  
  166. secreto = 420
  167.  
  168. comparar :: Int -> IO()
  169. comparar num
  170.     | num < secreto  = do putStrLn "El numero ingresado es menor al secreto"
  171.                           ingreso
  172.     | num > secreto  = do putStrLn "El numero ingresado es mayor al secreto"
  173.                           ingreso
  174.     | num == secreto = putStrLn "Adivinaste!"
  175.    
  176. ingreso::IO()
  177. ingreso = do putStr "Ingrese un número para adivinar: "
  178.              xs <- getLine
  179.              comparar (read xs)
  180.  
  181. main::IO()
  182. main = do hSetBuffering stdout NoBuffering
  183.           ingreso
  184.  
  185.  
  186.  
  187. -- EJERCICIO 15
  188. -- Hasta ahora puedo imprimir un tablero #yay
  189. import System.IO
  190.  
  191. type Tablero = ([Int], Int)
  192.  
  193. transform :: Int -> Int -> [Int]
  194. transform base 0 = []
  195. transform base n = base : (transform (2 * base) (n - base))
  196.  
  197. addup :: Int -> [(Int, Int)] -> [(Int, Int)]
  198. addup n [] = [(n, 1)]
  199. addup n ((a,b):xs) | n == a    = ((a, b + 1):xs)
  200.                    | n < a     = ((n, 1):((a,b):xs))
  201.                    | otherwise = ((a,b):(addup n xs))
  202.  
  203. tupleSum :: [(Int, Int)] -> Int
  204. tupleSum [] = 0
  205. tupleSum ((a,b):xs) = if (mod b 2) == 0 then tupleSum xs
  206.                                         else a + tupleSum xs
  207.  
  208. boardNimsum :: [Int] -> Int
  209. boardNimsum xs = tupleSum (foldr addup [] (concat (map (transform 1) xs)))
  210.  
  211. intToAsterisk :: Int -> String
  212. intToAsterisk 0 = ""
  213. intToAsterisk n = "* " ++ intToAsterisk (n - 1)
  214.  
  215. imprimirTablero :: Tablero -> IO()
  216. imprimirTablero ([], _ )   = putStrLn ""
  217. imprimirTablero ((x:xs),n) = do putStr (show n)
  218.                                 putStr ".\t"
  219.                                 putStrLn (intToAsterisk x)
  220.                                 imprimirTablero (xs, (n + 1))
  221.  
  222. main::IO()
  223. main = do hSetBuffering stdout NoBuffering
  224.           imprimirTablero ([5,4,7,9,0,0,1], 1)
  225.  
  226.  
  227. -- EJERCICIO 16
  228. import Data.Char
  229. import System.Environment
  230.  
  231. main :: IO ()
  232. main = do args <- getArgs
  233.           case args of
  234.                [inFile, outFile] -> do xs <- readFile inFile
  235.                                        writeFile outFile (map toUpper xs)
  236.                _ -> putStrLn "Cantidad errónea de argumentos. Se necesitan dos archivos."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement