Edición de «Práctica 1 (Paradigmas)»
De Cuba-Wiki
Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces publica los cambios para así efectuar la reversión.
Revisión actual | Tu texto | ||
Línea 42: | Línea 42: | ||
uncurry2 :: (a -> b -> c) -> (a,b) -> c | uncurry2 :: (a -> b -> c) -> (a,b) -> c | ||
uncurry2 f (a,b) = f a b | uncurry2 f (a,b) = f a b | ||
== Ejercicio 4 == | == Ejercicio 4 == | ||
pitagóricas :: [(Integer,Integer,Integer)] | pitagóricas :: [(Integer,Integer,Integer)] | ||
pitagóricas = [(a,b,c) | a <- [1..], b <-[1..], c <- [1..], a^2 + b^2 == c^2] | pitagóricas = [(a,b,c) | a <- [1..], b <-[1..], c <- [1..], a^2 + b^2 == c^2] | ||
pitagóricas' = [(a,b,c) | a <- [1..], b <-[1..(a^2)], c <- [1..(a^2 + b^2)], a^2 + b^2 == c^2] | |||
== Ejercicio 5 == | == Ejercicio 5 == | ||
primos :: [Integer] | primos :: [Integer] | ||
primos = take | primos = take 75 allPrimes | ||
allPrimes :: [Integer] | allPrimes :: [Integer] | ||
allPrimes = [x | x <- [1..], length (divisores x) == 2] | allPrimes = [x | x <- [1..], length (divisores x) == 2] | ||
Línea 63: | Línea 57: | ||
== Ejercicio 6 == | == Ejercicio 6 == | ||
partir :: [a] -> [([a],[a])] | |||
partir xs = [p | i <- [0..length xs], p <- [splitAt i xs]] | |||
== Ejercicio 7 == | == Ejercicio 7 == | ||
listasQueSuman :: Int -> [ [Int] | listasQueSuman :: Int -> [[Int]] | ||
== Ejercicio 8 == | == Ejercicio 8 == | ||
listasPositivas :: [ [Int] | listasPositivas :: [[Int]] | ||
== Ejercicio 9 == | == Ejercicio 9 == | ||
Línea 93: | Línea 79: | ||
filter2 :: (a -> Bool) -> [a] -> [a] | filter2 :: (a -> Bool) -> [a] -> [a] | ||
filter2 f xs = foldr (\x -> concat_if (f x) x) [] xs | filter2 f xs = foldr (\x -> concat_if (f x) x) [] xs | ||
where concat_if f = if f then (:) else (\_ -> | where concat_if f = if f then (:) else (\_ -> \xs -> xs) | ||
map2 :: (a -> b) -> [a] -> [b] | map2 :: (a -> b) -> [a] -> [b] | ||
Línea 104: | Línea 90: | ||
foldalt :: (a -> b -> b) -> (a -> b -> b) -> b -> [a] -> b | foldalt :: (a -> b -> b) -> (a -> b -> b) -> b -> [a] -> b | ||
foldalt _ _ b [] = b | foldalt _ _ b [] = b | ||
foldalt f g b (x:xs) = g x (foldalt g f b xs) | foldalt f g b (x:xs) = g x (foldalt g f b xs) | ||
(bis) | (bis) | ||
sumaAlt :: [Integer] -> Integer | sumaAlt :: [Integer] -> Integer | ||
sumaAlt = foldr (-) 0 | sumaAlt = foldr (-) 0 | ||
== Ejercicio 10 == | == Ejercicio 10 == | ||
Línea 126: | Línea 108: | ||
(\pref x -> pref ++ [(pref !! (length pref - 1)) ++ [x]]) | (\pref x -> pref ++ [(pref !! (length pref - 1)) ++ [x]]) | ||
[[]] | [[]] | ||
=== III === | === III === | ||
Línea 146: | Línea 122: | ||
(\x suf -> prefijos x ++ suf) | (\x suf -> prefijos x ++ suf) | ||
[[]] | [[]] | ||
== Ejercicio 11 == | == Ejercicio 11 == | ||
Línea 164: | Línea 127: | ||
sacarUna :: Eq a => a -> [a] -> [a] | sacarUna :: Eq a => a -> [a] -> [a] | ||
sacarUna x xs = fst(break (==x) xs) ++ tail(snd(break (==x) xs)) | sacarUna x xs = fst(break (==x) xs) ++ tail(snd(break (==x) xs)) | ||
== Ejercicio 12 == | == Ejercicio 12 == | ||
Línea 192: | Línea 146: | ||
=== II === | === II === | ||
armarPares :: [a] -> [a] -> [(a,a)] | armarPares :: [a] -> [a] -> [(a,a)] | ||
armarPares = foldr | armarPares = foldr | ||
(\a armarAs (b:bs) -> (a,b):armarAs bs) | (\a armarAs (b:bs) -> (a,b):armarAs bs) | ||
(const []) | (const []) | ||
Línea 217: | Línea 161: | ||
(\f1 sumarM1 (f2:m2) -> (zipWith (+) f1 f2) : sumarM1 m2) | (\f1 sumarM1 (f2:m2) -> (zipWith (+) f1 f2) : sumarM1 m2) | ||
(const []) | (const []) | ||
=== II === | === II === | ||
trasponer :: [[ | trasponer :: [[Int]] -> [[Int]] | ||
trasponer [] = [] | trasponer [] = [] | ||
trasponer ([]:m) = trasponer m | trasponer ([]:m) = trasponer m | ||
Línea 230: | Línea 169: | ||
(h : [hi | (hi:fi) <- m]) == Unir cabezas de filas | (h : [hi | (hi:fi) <- m]) == Unir cabezas de filas | ||
: trasponer (f : [fi | (hi:fi) <- m]) == Continuar trasponiendo matriz (sin cabezas) | : trasponer (f : [fi | (hi:fi) <- m]) == Continuar trasponiendo matriz (sin cabezas) | ||
== Ejercicio 16 == | == Ejercicio 16 == | ||
Línea 298: | Línea 216: | ||
=== I === | === I === | ||
foldNat :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer | foldNat :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer | ||
foldNat f x | foldNat f x 1 = x | ||
foldNat f x n = f x (foldNat f x (n-1)) | foldNat f x n = f x (foldNat f x (n-1)) | ||
=== II === | === II === | ||
potencia :: Integer -> Integer -> Integer | potencia :: Integer -> Integer -> Integer | ||
potencia | potencia = foldNat (*) | ||
== Ejercicio 18 == | == Ejercicio 18 == | ||
Línea 326: | Línea 244: | ||
=== I === | === I === | ||
empty :: Conj a | |||
empty = const False | |||
add :: Eq a => a -> Conj a -> Conj a | |||
add x c = \y -> (if x == y then True else c y) | |||
=== II === | === II === | ||
Línea 348: | Línea 266: | ||
=== IV === | === IV === | ||
prim :: a -> [Conj a] -> Int | |||
prim x cs = primi x cs 1 | |||
-- prim 3 [(add 2 (add 3 empty)), (add 4 (add 5 empty))] | |||
primi :: a -> [Conj a] -> Int -> Int | |||
primi _ [] _ = 0 | |||
primi x (c:cs) i = if c x then i else primi x cs (i+1) | |||
== Ejercicio 20 == | == Ejercicio 20 == | ||
Línea 411: | Línea 335: | ||
nodos = foldAB 0 (\a x b -> 1 + a + b) | nodos = foldAB 0 (\a x b -> 1 + a + b) | ||
hojas :: AB a -> Int | hojas :: AB a -> Int | ||
hojas = foldAB 0 (\a x -> (+1)) | hojas = foldAB 0 (\a x -> (+1)) |