Haskell/Soluções: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
→‎Listas III: adicionado
Linha 595:
fstComSndPar ls = (map fst . filter faux) ls
where faux (x,y) = ePar y
</source>
 
== [[Haskell/Declaração de tipos|Declaração de tipos]] ==
 
{{Exercícios|1=
Observe a função <code>mostrarData</code>. Ela existe apenas para deixar mais clara a definição <code>mostrarAniversario</code>. Note que são passados três argumentos a ela: um ano, um mês e um dia, representados por Ints. Sabemos que não faz sentido passar os argumentos fora de ordem pois são parte de uma data única. Poderíamos, portanto, criar um tipo <tt>Data</tt> para armazenar apenas datas e evitar confusões:
* Declare um tipo <tt>Data</tt> que armazene três Ints para representar ano, mês e dia.
* Reescreva o tipo <tt>Aniversario</tt> usando <tt>Data</tt>.
* Reescreva as funções <code>mostrarData</code> e <code>mostrarAniversario</code> usando as novas declarações de <tt>Data</tt> e <tt>Aniversario</tt>.
* Redefina <code>joaoRomao</code> e <code>romaoCasamento</code>.
}}
 
<source lang="haskell">
data Data = Data Int Int Int -- ano, mês, dia
data Aniversario = Nascimento String Data -- nome, data
| Casamento String String Data -- nome 1, nome 2, Data
 
mostrarData :: Data -> String
mostrarData (Data a d m) = show a ++ "-" ++ show m ++ "-" ++ show d
 
mostrarAniversario :: Aniversario -> String
mostrarAniversario (Nascimento n d) =
n ++ " nasceu em " ++ mostrarData d
mostrarAniversario (Casamento n1 n2 d) =
n1 ++ " casou-se com " ++ n2 ++ " em " ++ mostrarData d
 
joaoRomao :: Aniversario
joaoRomao = Nascimento "João Romão" (Data 1968 7 3)
 
romaoCasamento :: Aniversario
romaoCasamento = Casamento "João Romão" "Maria Romão" (Data 1987 3 4)
</source>
 
 
{{Exercícios|1=
Reescreva a declarção de <tt>Aniversario</tt> usando o sinônimo <tt>Nome</tt>, e mantendo o uso de <tt>Data</tt>.}}
 
<source lang="haskell">
type Nome = String
data Data = Data Int Int Int -- ano, mês, dia
data Aniversario = Nascimento Nome Data -- nome, data
| Casamento Nome Nome Data -- nome 1, nome 2, Data
</source>