-
Notifications
You must be signed in to change notification settings - Fork 1
/
Practica 11.hs
103 lines (69 loc) · 3.4 KB
/
Practica 11.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
-- aAaAaaaAh
data Pizza = Prepizza | Capa Ingrediente Pizza deriving Show
data Ingrediente = Aceitunas Int | Anchoas | Cebolla | Jamon | Queso | Salsa deriving Show
piza = Capa (Aceitunas 9) (Capa (Aceitunas 8) (Capa Queso Prepizza))
cantidadCapasQueCumplen :: (Ingrediente -> Bool) -> Pizza -> Int
cantidadCapasQueCumplen _ Prepizza = 0
cantidadCapasQueCumplen f (Capa i p) = fromEnum (f i) + cantidadCapasQueCumplen f p
conCapasTransformadas :: (Ingrediente -> Ingrediente) -> Pizza -> Pizza
conCapasTransformadas _ Prepizza = Prepizza
conCapasTransformadas f (Capa i p) = Capa (f i) (conCapasTransformadas f p)
soloLasCapasQue :: (Ingrediente -> Bool) -> Pizza -> Pizza
soloLasCapasQue _ Prepizza = Prepizza
soloLasCapasQue f (Capa i p) = (if f i then Capa i else id) (soloLasCapasQue f p)
-- Ejercio 2
esQueso :: Ingrediente -> Bool
esQueso Queso = True
esQueso _ = False
esAceituna :: Ingrediente -> Bool
esAceituna (Aceitunas _) = True
esAceituna _ = False
sinLactosa :: Pizza -> Pizza
sinLactosa = soloLasCapasQue (not . esQueso)
aptaIntolerantesLactosa :: Pizza -> Bool
aptaIntolerantesLactosa = (==0) . cantidadCapasQueCumplen esQueso
cantidadDeQueso :: Pizza -> Int
cantidadDeQueso = cantidadCapasQueCumplen esQueso
aceitunaDuplicator :: Ingrediente -> Ingrediente
aceitunaDuplicator (Aceitunas i) = Aceitunas (i*2)
aceitunaDuplicator i = i
conElDobleDeAceitunas :: Pizza -> Pizza
conElDobleDeAceitunas = conCapasTransformadas aceitunaDuplicator
-- Ejercicio 3
pizzaProcesada :: (Ingrediente -> b -> b) -> b -> Pizza -> b
pizzaProcesada _ z Prepizza = z
pizzaProcesada f z (Capa i p) = f i (pizzaProcesada f z p)
-- Ejercicio 4
cantidadCapasQueCumplen' :: (Ingrediente -> Bool) -> Pizza -> Int
cantidadCapasQueCumplen' f = pizzaProcesada (\i z -> fromEnum (f i) + z) 0
{- cantidadCapasQueCumplen' f = pizzaProcesada ((+) . fromEnum . f) 0
-}
conCapasTransformadas' :: (Ingrediente -> Ingrediente) -> Pizza -> Pizza
conCapasTransformadas' ingTransformer = pizzaProcesada (Capa . ingTransformer) Prepizza
soloLasCapasQue' :: (Ingrediente -> Bool) -> Pizza -> Pizza
soloLasCapasQue' matchPredicate = pizzaProcesada (\i z -> if matchPredicate i then Capa i z else z) Prepizza
sinLactosa' :: Pizza -> Pizza
sinLactosa' = pizzaProcesada (\i z -> if (not . esQueso) i then Capa i z else z) Prepizza
aptaIntolerantesLactosa' :: Pizza -> Bool
aptaIntolerantesLactosa' = pizzaProcesada (\i z -> (not . esQueso) i && z) True
cantidadDeQueso' :: Pizza -> Int
cantidadDeQueso' = pizzaProcesada ((+) . fromEnum . esQueso) 0
conElDobleDeAceitunas' :: Pizza -> Pizza
conElDobleDeAceitunas' = pizzaProcesada (Capa . aceitunaDuplicator) Prepizza
-- Ejercicio 5
cantidadAceitunas :: Pizza -> Int
cantidadAceitunas = pizzaProcesada ((+) . fromEnum . esAceituna) 0
capasQueCumplen :: (Ingrediente -> Bool) -> Pizza -> [Ingrediente]
capasQueCumplen p = pizzaProcesada (\i z -> if p i then i : z else z) []
conDescripcionMejorada :: Pizza -> Pizza
conDescripcionMejorada = pizzaProcesada juntarAceitunas Prepizza
juntarAceitunas :: Ingrediente -> Pizza -> Pizza
juntarAceitunas (Aceitunas n) (Capa (Aceitunas m) p) = Capa (Aceitunas (n + m)) p
juntarAceitunas i p = Capa i p
tieneAceitunaAdelante :: Pizza -> Bool
tieneAceitunaAdelante (Capa (Aceitunas _) _) = True
tieneAceitunaAdelante _ = False
getAceitunas :: Pizza -> Int
getAceitunas (Capa (Aceitunas n) _) = n
conCapasDe :: Pizza -> Pizza -> Pizza
conCapasDe = pizzaProcesada (\i z -> Capa i z)