-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGranja.hs
144 lines (97 loc) · 3.23 KB
/
Granja.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
{-# OPTIONS_GHC -Wno-missing-fields #-}
import Data.List ()
import Text.Show.Functions ()
luci :: Animal
luci = Animal "luci" 30 10 True 80 120
orejon :: Animal
orejon = Animal "orejon" 50 15 False 30 20
budi :: Animal
budi = Animal "budi" 10 10 True 0 20
mini :: Animal
mini = Animal "mini" 0 10 False 10 500
shovi :: Animal
shovi = Animal "shovi" 80 30 True 120 1200
carlos :: Veterinario
carlos = Veterinario {
vitaminas = 2,
diasDeRecuperacionVet = 40,
costoVet = 500
}
data Animal = Animal {
nombre :: String,
peso :: Double,
edad :: Double,
estaEnfermo :: Bool,
diasDeRecuperacion :: Double,
costo :: Double
} deriving (Show)
data Veterinario = Veterinario {
diagnostico :: Diagnostico,
diasDeRecuperacionVet :: Double,
costoVet :: Double,
vitaminas :: Double
} deriving (Show)
type Diagnostico = Animal -> Animal
laPasoMal :: Animal -> Bool
laPasoMal animal = (>30) $ diasDeRecuperacion animal
nombreFalopa :: Animal -> Bool
nombreFalopa animal = (=='i') . last $ nombre animal
type KilosComida = Double
engorde :: KilosComida -> Animal -> Animal
engorde kilosComida animal = Animal {
nombre = nombre animal,
peso = peso animal + min 5 (kilosComida/2),
edad = edad animal,
estaEnfermo = estaEnfermo animal,
diasDeRecuperacion = diasDeRecuperacion animal,
costo = costo animal
}
type Revisacion = Veterinario -> Animal -> Animal
revisacion :: Revisacion
revisacion veterinario animal = Animal {
nombre = nombre animal,
peso = (+) 2 $ peso animal,
edad = edad animal,
estaEnfermo = False,
diasDeRecuperacion = diasDeRecuperacionVet veterinario,
costo = costoVet veterinario
}
festejoCumple :: Animal -> Animal
festejoCumple animal = Animal {
nombre = nombre animal,
edad = (+) (edad animal) 1,
peso = (-) (peso animal) 1,
estaEnfermo = estaEnfermo animal,
diasDeRecuperacion = diasDeRecuperacion animal,
costo = costo animal
}
type PesoLimite = Double
chequeoDePeso :: PesoLimite -> Animal -> Animal
chequeoDePeso pesoLimite animal
| peso animal < pesoLimite = Animal{nombre = nombre animal,
edad = edad animal,
peso = peso animal,
estaEnfermo = True,
diasDeRecuperacion = diasDeRecuperacion animal,
costo = costo animal}
| otherwise = Animal{nombre = nombre animal,
edad = edad animal,
peso = peso animal,
estaEnfermo = False,
diasDeRecuperacion = diasDeRecuperacion animal,
costo = costo animal}
type Actividad = Animal -> Animal
type Proceso = [Actividad]
proceso1 :: Proceso
proceso1 = [engorde 8, festejoCumple, chequeoDePeso 20]
elProceso :: Proceso -> Animal -> Animal
elProceso proceso animal = foldr ($) animal proceso
mejoraONoMejora :: Proceso -> Animal -> Bool
mejoraONoMejora [] animal = True
mejoraONoMejora (x:xs) animal = (&&) ((<=) (peso $ x animal) (peso animal + 3)) ((>) (peso $ x animal) (peso animal)) && mejoraONoMejora xs animal
type Animales = [Animal]
animales1 :: Animales
animales1 = [luci,orejon,budi,mini,shovi]
giveMeThree :: Animales -> Animales
giveMeThree = take 3 . filter nombreFalopa
--seria posible por el lazy evaluation y la funcion "take" que solo toma los 3 primeros de cualquier lista que le deseemos pasar sin importarle la cantidad de elementos que esta misma posea