-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPadrinosMagicos.hs
86 lines (57 loc) · 2.56 KB
/
PadrinosMagicos.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
import Text.Show.Functions
import Data.List (union)
data Chico = UnChico {
nombre :: String,
edad :: Int,
habilidades :: [Habilidad],
deseos :: [Deseo]
} deriving Show
type Habilidad = String
type Deseo = Chico -> Chico
-- A
aprenderHabilidades :: [Habilidad] -> Deseo
aprenderHabilidades unasHabilidades unChico = unChico {habilidades = habilidades unChico ++ unasHabilidades}
serGrosoEnNeedForSpeed :: Deseo
serGrosoEnNeedForSpeed = aprenderHabilidades grosoEnNeedForSpeed
grosoEnNeedForSpeed :: [Habilidad]
grosoEnNeedForSpeed = map jugarNeedForSpeed [1..]
jugarNeedForSpeed :: Int -> Habilidad
jugarNeedForSpeed unNumero = "jugar need for speed " ++ show unNumero
serMayor :: Deseo
serMayor = modificarEdad (const 18)
wanda :: Chico -> Chico
wanda = cumplirPrimerDeseo.modificarEdad (+1)
cumplirPrimerDeseo :: Chico -> Chico
cumplirPrimerDeseo unChico = head (deseos unChico) unChico
modificarEdad :: (Int -> Int) -> Chico -> Chico
modificarEdad unaFuncion unChico = unChico {edad = unaFuncion.edad $ unChico}
cosmo :: Chico -> Chico
cosmo = modificarEdad (div 2)
muffinMagico :: Chico -> Chico
muffinMagico unChico = foldr ($) unChico (deseos unChico)
-- B
tieneHabilidad :: Habilidad -> CondicionParaElegirChico
tieneHabilidad unaHabilidad unChico = elem unaHabilidad $ habilidades unChico
esSuperMaduro :: CondicionParaElegirChico
esSuperMaduro unChico = tieneHabilidad "sabe manejar" unChico && esMayor unChico
esMayor :: Chico -> Bool
esMayor = (>18).edad
data Chica = UnaChica {
nombreChica :: String,
condicion :: CondicionParaElegirChico
} deriving Show
type CondicionParaElegirChico = Chico -> Bool
quienConquistaA :: Chica -> [Chico] -> Chico
quienConquistaA unaChica (pretendiente1:cola) | elChicoTieneLasCondiciones pretendiente1 unaChica = pretendiente1
| otherwise = quienConquistaA unaChica cola
elChicoTieneLasCondiciones :: Chico -> Chica -> Bool
elChicoTieneLasCondiciones unChico unaChica = condicion unaChica unChico
nuevaChica = UnaChica "Chica de prueba" (tieneHabilidad "sabe cocinar")
-- quienConquistaA nuevaChica listaDePretendientes
-- C
infractoresDeDaRules :: [Chico] -> [String]
infractoresDeDaRules (chico1:cola) | (/=) (union deseosProhibidos (take 5 $ habilidades chico1)) [] = nombre chico1 : infractoresDeDaRules cola
| otherwise = infractoresDeDaRules cola
deseosProhibidos :: [Habilidad]
deseosProhibidos = ["enamorar","matar","dominar el mundo"]
-- D