thehtml
Tenim definit un tipus per guardar duracions temporals de la forma següent:
data Temps = Temps Int Int
on el primer enter correspon a les hores i el segon als minuts. Se suposa que les hores es troben entre 0 i 99 i els minuts entre 0 i 59.
També tenim arbres genèrics definits així:
data Arbre a = Arbre a [Arbre a]
-
Feu que Temps sigui instància de la classe Show tot fent que els dos nombres es mostrin sempre amb dues xifres amb un ’:’ al mig.
ghci> Temps 1 5
01:05
ghci> Temps 2 10
02:10
- Implementeu una funció suma :: Temps -> Temps -> Temps que, donats dos temps, en retorni la seva suma.
ghci> suma (Temps 1 5) (Temps 2 10)
03:15
ghci> suma (Temps 1 35) (Temps 2 40)
04:15
- Implementeu una funció sumes :: [Temps] -> Temps sense recursivitat i en notació "point free (sense paràmetres) que, donada una llista de temps, retorni la suma dels seus elements.
ghci> sumes [Temps 1 35,Temps 2 40]
04:15
ghci> sumes [Temps 1 35,Temps 2 40,Temps 9 10]
13:25
- Implementeu una funció sumesArbre :: Arbre Temps -> Temps que, donat un arbre general de duracions, calculi la suma dels seus temps. Per exemple:
ghci> let f = Arbre (Temps 2 40) [Arbre (Temps 1 1) []]
ghci> let t = (Arbre (Temps 1 35) [f, Arbre (Temps 9 10) []])
ghci> sumesArbre f
03:41
ghci> sumesArbre t
14:26
- Feu un programa implementant una acció main :: IO () que:
-
obtingui una llista de temps separats per espais de l’entrada estàndar (en una única linia),
- parsegi l’entrada obtenint una llista de temps,
- en calculi la seva suma i,
- mostri el resultat per la sortida estàndar.