this repo has no description
1* Function Composition
2
3Composicao de funcao tem a mesma sintaxe e declarao quando utilizamos na matematica, segue um exemplo de como seria o assinatura da funcao:
4#+begin_src haskell
5(f . g) x = f (g x)
6(.) :: (b -> c) -> (a -> b) -> (a -> c)
7f . g == f (g x)
8#+end_src
9
10Nessa assinatura, declaramos que recebemos uma funcao que recebe B e retorna C (esta primeira ira receber o valor da proxima funcao), a proxima funcao que ira receber A e retornar B (alimentando assim a primeira funcao) e que no final nos retornara uma ultima funcao que ira receber A (entrada da segunda funcao) e retornara C (saida da primeira funcao).
11
12Com isso podemos deixar de forma sequecial a ordem de execucao das funcoes e facilitando assim a leitura do codigo.
13
14Com essas ideias, podemos levar em consideracao a seguinte implementacao:
15#+begin_src haskell
16somaDosQuadradosImpares =
17 sum (takeWhile (<1000) (filter odd (map (^2) [1..]))))
18#+end_src
19
20Podemos reescrever essa funcao utilizando o operador ~pipe~ (~$~):
21#+begin_src haskell
22somaDosQuadradosImpares' = sum
23 $ takeWhile (<1000)
24 $ filter odd
25 $ map (^2) [1..]
26#+end_src
27
28E por ultimo, a versao utilizando composicao de funcao:
29#+begin_src haskell
30somaDosQuadradosImpares'' = sum . takeWhile (<1000) . filter odd . map (^2) $ [1..]
31#+end_src
32
33Todas realizam a mesma operacao, o que ira facilitar seria a legibilidade da funcao para os demais desenvolvedores.