Permalink
Browse files

traducao cap06.07

  • Loading branch information...
1 parent 4f3c637 commit 65fe47363c1a1f99dcd0ba5bd7e884b87432c159 Tailor Fontela committed Oct 21, 2011
Showing with 14 additions and 17 deletions.
  1. +1 −1 README
  2. +13 −16 lang-pt-br/learnhaskell-chapter06-part07.yml
View
2 README
@@ -51,7 +51,7 @@ chapter06-part03 - [ traduzido ]
chapter06-part04 - [ traduzido ]
chapter06-part05 - [ traduzido ]
chapter06-part06 - [ traduzido ]
-chapter06-part07 - em tradução por @taylorrf
+chapter06-part07 - [ traduzido ]
chapter07 - [ traduzido ]
chapter07-part02 - [ traduzido ]
chapter07-part03 - [ traduzido ]
@@ -1,37 +1,34 @@
title: Composição de funções
-text: Na matemática, <a href="http://pt.wikipedia.org/wiki/Composi%C3%A7%C3%A3o_de_fun%C3%A7%C3%B5es" target="_blank">composição de funções</a> é definida como: [image " (f . g)(x) = f(g(x))"], que significa que compor duas funções produz uma nova função, quando chamamos com um parâmetro, digamos, <i>x</i> é o equivalente a chamar <i>g</i> com o parametro <i>x</i> e então chamar o <i>f</i> com aquele resultado.
+text: Na matemática, <a href="http://pt.wikipedia.org/wiki/Composi%C3%A7%C3%A3o_de_fun%C3%A7%C3%B5es" target="_blank">composição de funções</a> é definida como: [image " (f . g)(x) = f(g(x))"], que significa que compor duas funções produz uma nova função, quando chamamos com um parâmetro, digamos, <i>x</i> é o equivalente a chamar <i>g</i> com o parâmetro <i>x</i> e então chamar o <i>f</i> com aquele resultado.
Em Haskell, composição de funções é praticamente a mesma coisa. Fazemos uma composição de funções com a função [code].[/code], que é definida como:
-Atente na declaração de tipo. [code]f[/code] deve ter como parâmetro um valor com o mesmo tipo do valor retornado de [code]g[/code]. Assim, a função resultante assume um parâmetro do mesmo tipo daquele [code]g[/code] que assume e retorna um valor do mesmo tipo que [code]f[/code] retorna. A expressão [code]negate . (* 3)[/code] retorna uma função que pega um número, multiplica ele por 3 e então faz a negação dele.
+Atente na declaração de tipo. [code]f[/code] deve ter como parâmetro um valor com o mesmo tipo do valor retornado de [code]g[/code]. Assim, a função resultante assume um parâmetro do mesmo tipo daquele [code]g[/code] que assume e retorna um valor do mesmo tipo que [code]f[/code] retorna. A expressão [code]negate . (* 3)[/code] retorna uma função que pega um número, multiplica ele por 3 e então faz a negação.
-Um dos usos para composição de funções é fazer funções em tempo de execução para passar para outras funções. Claro, nós podemos usar lambdas para isso, mas muitas vezes, composição de funções é mais clara e conciso. Digamos que temos ums lista de números e nós queremos então tornar todos em números negativos. Uma forma para fazer isto seria pegar cada número com valor absoluto e então nega-lo, como isso:
+Um dos usos da composição de funções é fazer funções em tempo de execução para passar para outras funções. Claro, nós podemos usar lambdas para isso, mas muitas vezes, composição de funções é mais clara e concisa. Digamos que temos uma lista de números e nós queremos então tornar todos em números negativos. Uma forma para fazer isto seria pegar cada número com valor absoluto e então negá-lo, como isso:
Observe a lambda e como ela se parece com o resultado da composição da função. Usando composição de função, podemos reescrever isto como:
-Fabuloso! Composição de funções é assiciativo à direita, então nós podemos compor muitas funções ao mesmo tempo. A expressão [code]f (g (z x))[/code] é o equivalente a [code](f . g . z) x[/code]. Com isso em mente, podemos transformar isto
-
+Fabuloso! Composição de funções é associativo à direita, então nós podemos compor muitas funções ao mesmo tempo. A expressão [code]f (g (z x))[/code] é o equivalente a [code](f . g . z) x[/code]. Com isso em mente, podemos transformar isto
nisso
+Mas e quando funções têm muitos parâmetros? Bem, se você quiser usar na composição de funções, terá que aplicar parcialmente cada função pegando apenas um parâmetro. [code] sum (replicate 5 (max 6.7 8.9))[/code] pode ser reescrita como [code](sum . replicate 5 . max 6.7) 8.9[/code] ou como [code]sum . replicate 5 . max 6.7 $ 8.9[/code]. O que acontece aqui é: uma função que pega o resultado de [code]max 6.7[/code] e aplica em [code]replicate 5[/code]. Em seguida, a função pega o resultado disso e não a soma do que é criado. Finalmente, a função é chamada com [code]8.9[/code]. Mas normalmente, você lê isso como: aplique [code]8.9[/code] em [code]max 6.7[/code], então aplique [code]replicate 5[/code] e depois aplique [code]sum[/code]. Se você quiser reescrever essa expresão com alguns parênteses usando composição de funções, você pode começar colocando o último parâmetro na função mais interna após um [code]$[/code] e depois compor todas as outras chamadas de funções, escrevendo sem o último parâmetro e colocando pontos entre eles. Se você tiver [code]replicate 100 (product (map (*3) (zipWith max [1,2,3,4,5] [4,5,6,7,8])))[/code], você pode escrever isso como [code]replicate 100 . product . map (*3) . zipWith max [1,2,3,4,5] $ [4,5,6,7,8][/code]. Se a função terminar com uma árvore de parânteses, são grandes as chances de você traduzir em uma composição de função, que terá três operadores de composição.
-Mas e quando funções têm muitos parâmetros? Bem, se você quiser usar isso na composição de funções,
-
-But what about functions that take several parameters? Well, if we want to use them in function composition, we usually have to partially apply them just so much that each function takes just one parameter. [code] sum (replicate 5 (max 6.7 8.9))[/code] can be rewritten as [code](sum . replicate 5 . max 6.7) 8.9[/code] or as [code]sum . replicate 5 . max 6.7 $ 8.9[/code]. What goes on in here is this: a function that takes what [code]max 6.7[/code] takes and applies [code]replicate 5[/code] to it is created. Then, a function that takes the result of that and does a sum of it is created. Finally, that function is called with [code]8.9[/code]. But normally, you just read that as: apply [code]8.9[/code] to [code]max 6.7[/code], then apply [code]replicate 5[/code] to that and then apply [code]sum[/code] to that. If you want to rewrite an expression with a lot of parentheses by using function composition, you can start by putting the last parameter of the innermost function after a [code]$[/code] and then just composing all the other function calls, writing them without their last parameter and putting dots between them. If you have [code]replicate 100 (product (map (*3) (zipWith max [1,2,3,4,5] [4,5,6,7,8])))[/code], you can write it as [code]replicate 100 . product . map (*3) . zipWith max [1,2,3,4,5] $ [4,5,6,7,8][/code]. If the expression ends with three parentheses, chances are that if you translate it into function composition, it'll have three composition operators.
+Outro uso comum da composição de função é definir funções em um estilo chamado de 'ponto livre'. Pegue como exemplo esta função que escrevemos anteriormente:
-Another common use of function composition is defining functions in the so-called point free style (also called the point<i>less</i> style). Take for example this function that we wrote earlier:
+O [code]xs[/code] é exposto em ambos os lados. Por causa do currying, nós podemos omitir o [code]xs[/code] em ambos os lados, porque chamar [code]foldl (+) 0[/code] cria uma função que pega uma lista. Escrevendo a função como [code]sum' = foldl (+) 0[/code] é o que se chama de escrever com o estilo ponto livre. Como podemos escrever isso no estilo ponto livre?
-The [code]xs[/code] is exposed on both right sides. Because of currying, we can omit the [code]xs[/code] on both sides, because calling [code]foldl (+) 0[/code] creates a function that takes a list. Writing the function as [code]sum' = foldl (+) 0[/code] is called writing it in point free style. How would we write this in point free style?
+Não podemos simplesmente se livrar do [code]x[/code] em ambos os lados. O [code]x[/code] no corpo da função esta entre parênteses. [code]cos (max 50)[/code] não faz sentido. Você não obtém o cosseno da função. O que podemos fazer é expressão [code]fn[/code] com uma composição de funções.
-We can't just get rid of the [code]x[/code] on both right right sides. The [code]x[/code] in the function body has parentheses after it. [code]cos (max 50)[/code] wouldn't make sense. You can't get the cosine of a function. What we can do is express [code]fn[/code] as a composition of functions.
-Excellent! Many times, a point free style is more readable and concise, because it makes you think about functions and what kind of functions composing them results in instead of thinking about data and how it's shuffled around. You can take simple functions and use composition as glue to form more complex functions. However, many times, writing a function in point free style can be less readable if a function is too complex. That's why making long chains of function composition is discouraged, although I plead guilty of sometimes being too composition-happy. The prefered style is to use <i>let</i> bindings to give labels to intermediary results or split the problem into sub-problems and then put it together so that the function makes sense to someone reading it instead of just making a huge composition chain.
+Excelente! Muitas vezes, o estilo ponto livre é mais legível e conciso, porque ele faz você pensar sobre as funções e o que cada função que compõe os resultados fazem ao invés de pensar sobre os dados e como eles são embaralhados. Você pode pegar funções simples e usar composição como cola para tornar mais complexa. Tanto faz, usar o estilo ponto livre pode se tornar menos legível se a função for muito complexa. Por isso que não é recomendado fazer longas composições de funções, apesar de eu me declarar culpado por usar composição muitas vezes. O estilo preferencial é usar uma associação <i>let</i> para rotular resultados intermediários ou juntar o problema em subproblemas e depois colocá-los juntos para que a função faça sentido para que alguém que irá ler ao invés de fazer uma longa cadeia de composições.
-In the section about maps and filters, we solved a problem of finding the sum of all odd squares that are smaller than 10.000. Here's what the solution looks like when put into a function.
+Na sessão sobre mapas e filtros, resolvemos um problema encontrando a soma de todos os quadrados ímpares que são menores do que 10.000. Veja como fica a solução quando colocamos isso na função.
-Being such a fan of function composition, I would have probably written that like this:
+Sendo um grande fã de composição de função, provavelmente eu teria escrito assim:
-However, if there was a chance of someone else reading that code, I would have written it like this:
+No entanto, se tiver alguma chance de outra pessoa ler esse código, eu escreveria então assim:
-It wouldn't win any code golf competition, but someone reading the function will probably find it easier to read than a composition chain.
+Eu não iria ganhar nenhuma competição de golfe com esse código, mas qualquer um que ler a função provavelmente vai achar mais fácil ler isso do que uma cadeia de composição.

0 comments on commit 65fe473

Please sign in to comment.