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

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 637:
data Aniversario = Nascimento Nome Data -- nome, data
| Casamento Nome Nome Data -- nome 1, nome 2, Data
</source>
 
== [[Haskell/Lambdas e operadores|Lambdas e operadores]] ==
 
{{Exercícios|1=Reescreva as seguintes expressões usando lambdas:
* <code>map f xs where f x = x * 2 + 3</code>
* <code>let f x y = read x + y in foldr f 1 xs</code>}}
 
* <source lang="haskell">
map (\x -> x * 2 + 3) xs
</source>
* <source lang="haskell">
foldr (\x y -> read x + y) 1 xs
</source>
 
{{Exercício|# Seções são açúcar sintático para expressões lambdas. Reescreva as seguintes seções na forma de lambdas determine seus tipos:
## <code>(4+)</code>
## <code>(1 `elem`)</code>
## <code>(`notElem` "abc")</code>
#
# Teste as seguintes linhas no GHCi:
:: <source lang="haskell">
norma3D x y z = sqrt (x^2 + y^2 + z^2)
norma3D' a b = a `norma3D` b
</source>
:: Se a notação infixa só pode ser usada com funções de dois argumentos, por que a definição de <code>norma3D'</code> é válida? Os resultados de <code>norma3D</code> e <code>norma3D'</code> serão sempre iguais? Dica: observe os tipos de cada uma das funções e lembre-se de ''[[Haskell/Listas II#Currying|currying]]''.}}
 
#
## <source lang="haskell">
(\x -> 4 + x) :: (Num a) => a -> a
</source>
## <source lang="haskell">
(\xs -> elem 1 xs) :: [a] -> Bool
</source>
## <source lang="haskell">
(\c -> notElem c "abc") :: Char -> Bool
</source>
#
# A função <code>norma3D</code> possui três argumentos, portanto seu tipo é da forma <code>a -> a -> a -> a</code>. Como temos o efeito de ''currying'', podemos considerar que <code>norma3D</code> tem dois argumentos se pensarmos seu tipo como sendo <code>a -> a -> (a -> a)</code>, isto é, uma função de dois argumentos que retorna uma função de um argumento. Assim sendo, se usarmos a notação de ponto livre, isto é, omitindo o terceiro argumento, forçamos o ''currying'' e podemos usar a notação infixa. Portanto, <code>nomra3D' a b</code> é, repetindo, ''uma função de dois argumentos que retorna uma função de um argumento'', sendo que podemos usá-la com três argumentos, pois <code>(f m) n == f m n</code>. Também é fácil ver que os resultados serão sempre iguais se expandirmos a aplicação de <code>norma3D'</code>:
::<source lang="haskell">
(norma3D' a b) c
(a `norma3D` b) c
(norma3D a b) c
norma3D a b c
</source>