Haskell/Lambdas e operadores: diferenças entre revisões
[edição verificada] | [revisão pendente] |
Conteúdo apagado Conteúdo adicionado
mSem resumo de edição |
m <source> -> <syntaxhighlight> (phab:T237267) |
||
Linha 8:
Relembrando os exemplos do capítulo [[Haskell/Listas II|Listas II]], suponha que queiramos dobrar todos os elementos de uma lista. Uma possível função para este trabalho seria:
<
dobrarLista ls = map dobro ls
where dobro x = 2 * x
</syntaxhighlight>
Ou ainda:
<
dobrarLista ls = let dobro x = 2 * x
in map dobro ls
</syntaxhighlight>
Outra solução, porém, seria usar uma ''expressão lambda'' para representar a função auxilar <code>dobro</code> sem precisar usar <code>let</code> ou <code>where</code>:
<
dobrarLista ls = map (\x -> 2 * x) ls
</syntaxhighlight>
Antes de entendermos a notação, precisamos fazer uma breve correlação entre Matemática e Computação.
Linha 46:
Há um jeito, porém, de dar nomes às funções anônimas. Basta declarar uma variável que seja a função anônima. Por exemplo:
<
pitagoras = \x y -> sqrt (x^2 + y^2)
</syntaxhighlight>
Acabamos de criar a função <code>pitagoras</code> a partir de uma expressão lambda que possui dois argumentos. Podemos testar no GHCi:
Linha 71:
Novos operadores podem ser definidos como quaisquer outras funções, basta não usar caracteres alfanuméricos em seus nomes e colocando parênteses na assinatura de tipo. Por exemplo, vejamos a definição da função <code>(\\)</code> do módulo <code>Data.List</code>, a qual elimina os elementos iguais de duas listas:
<
(\\) :: (Eq a) => [a] -> [a] -> [a]
xs \\ ys = foldl (\zs y -> delete y zs) xs ys
</syntaxhighlight>
A segunda linha também poderia ser escrita de forma infixa, mas é opcional:
<
(\\) xs ys = foldl (\zs y -> delete y zs) xs ys
</syntaxhighlight>
=== Seções ===
Linha 85:
''Seções'' são um tipo de açúcar sintático que permite criamos novas funções a partir da aplicação parcial de operadores. Por exemplo, a função <code>dobro</code> que vimos antes pode ser definida como:
<
dobro x = (2*) x
</syntaxhighlight>
Ou ainda, usando a notação de ponto livre:
<
dobro = (2*)
</syntaxhighlight>
Assim sendo, podemos escrever a função <code>dobrarLista</code> de maneira ainda mais concisa, sem usar expressões lambda:
<
dobrarLista ls = map (*2) ls
</syntaxhighlight>
Deve-se notar, entretanto, que para a maioria dos operadores, a ordem do argumento fixo importa:
Linha 137:
#
# Teste as seguintes linhas no GHCi:
:: <
norma3D x y z = sqrt (x^2 + y^2 + z^2)
nomra3D' a b = a `norma3D` b
</syntaxhighlight>
:: 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? Dica: observe os tipos de cada uma das funções e lembre-se de ''[[Haskell/Listas II#Currying|currying]]''.}}
|