···11+* Condicionais
22+E como toda linguagem de programacao, tambem temos condicionais para criar logicas nos nossos codigos.
33+44+*lembrete que a identacao de nosso codigo eh de extrema importancia*
55+66+#+begin_src haskell
77+:{
88+signum :: (Num a, Ord a) => a -> a
99+signum n = if n < 0
1010+ then -1
1111+ else if n == 0
1212+ then 0
1313+ else 1
1414+:}
1515+1616+signum 10
1717+#+end_src
1818+1919+#+RESULTS:
2020+: 1
2121+2222+#+begin_src haskell
2323+:{
2424+raizes2GrauV4 :: (Ord a, Floating a) => a -> a -> a -> (a, a)
2525+raizes2GrauV4 a b c =
2626+ if delta < 0
2727+ then error "Delta negativo"
2828+ else (x1, x2)
2929+ where
3030+ x1 = ((-b) + sqDelta) / (2 * a)
3131+ x2 = ((-b) - sqDelta) / (2 * a)
3232+ sqDelta = sqrt delta
3333+ delta = b^(2 :: Int) - 4 * a * c
3434+:}
3535+3636+raizes2GrauV4 2 3 5
3737+#+end_src
3838+3939+#+RESULTS:
4040+#+begin_example
4141+,*** Exception: Delta negativo
4242+CallStack (from HasCallStack):
4343+ error, called at <interactive>:55:8 in interactive:Ghci19
4444+#+end_example
4545+4646+** Guards
4747+Tambem para facilitar a leitura e diminuir a verbosidade, podemos utilizar o *Guards* nas nossas funcoes para declarar a mesma encadeacao de condicionais feitas.
4848+#+begin_src haskell
4949+:{
5050+signumV2 :: (Num a, Ord a) => a -> a
5151+signumV2 n
5252+ | n < 0 = -1
5353+ | n == 0 = 0
5454+ | otherwise = 1
5555+:}
5656+5757+signumV2 (-20)
5858+#+end_src
5959+6060+#+RESULTS:
6161+: ghci>
6262+: <interactive>:96:1-14: warning: [-Wtype-defaults]
6363+: • Defaulting the following constraints to type ‘Integer’
6464+: (Show a0) arising from a use of ‘print’ at <interactive>:96:1-14
6565+: (Num a0) arising from a use of ‘it’ at <interactive>:96:1-14
6666+: (Ord a0) arising from a use of ‘it’ at <interactive>:96:1-14
6767+: • In a stmt of an interactive GHCi command: print it
6868+: -1
6969+7070+** Pattern Matching
7171+Ou podemos tambem criar pattern matching para deixar as nossas declaracoes de funcoes mais explicitas e sem sintaxe de logica no nosso codigo, apenas declarando algumas verdades para serem executadas e avalidas mais tarde.
7272+7373+#+begin_src haskell
7474+:{
7575+soma 0 y = y
7676+soma x 0 = x
7777+soma x y = x + y
7878+:}
7979+#+end_src
8080+8181+Ou podemos ignorar completamente as variavel nas nossas declaracoes de variavel nos pattern matching utilizando o ~_~ como parametro
8282+#+begin_src haskell
8383+:{
8484+mult 0 _ = 0
8585+mult _ 0 = 0
8686+mult 1 y = y
8787+mult x 1 = x
8888+mult x y = x * y
8989+:}
9090+#+end_src
9191+
+35
Haskell/Functions.org
···11+* Assinatura de funcao
22+As assinaturas de funcoes servem para declarar a tipagem que nossa funcao ira usar, retornar e os parametros que utilizaremos na funcao.
33+44+#+begin_src haskell
55+:{
66+raizes2Grau :: Floating a => a -> a -> a -> (a, a)
77+raizes2Grau a b c = (((-b) + sqrt(b^(2 :: Int) - 4 * a * c))/ (2 * a),
88+ ((-b) - sqrt(b^(2 :: Int) - 4 * a * c))/ (2 * a))
99+:}
1010+1111+raizes2Grau 2 3 5
1212+#+end_src
1313+1414+#+RESULTS:
1515+: (NaN,NaN)
1616+1717+** Clausula "where"
1818+Para facilitar a leitura e dividir as funcionalidades e facilitar a leitura, podemos declarar trechos do codigo para variaveis dentro da funcao a fim de facilitar a leitura e poder reaproveitar codigo dentro de nossas funcoes.
1919+2020+#+begin_src haskell
2121+:{
2222+raizes2GrauV2 :: Floating a => a -> a -> a -> (a, a)
2323+raizes2GrauV2 a b c = (x1, x2)
2424+ where
2525+ x1 = ((-b) + sqDelta) / (2 * a)
2626+ x2 = ((-b) - sqDelta) / (2 * a)
2727+ sqDelta = sqrt delta
2828+ delta = b^2 - 4 * a * c
2929+:}
3030+3131+raizes2GrauV2 2 3 (-5)
3232+#+end_src
3333+3434+#+RESULTS:
3535+: (1.0,-2.5)
+191
Haskell/Lists.org
···11+* Listas
22+Listas em Haskell tem o mesmo comportamento de listas ligadas, podemos declarar elas da seguinte forma
33+#+begin_src haskell
44+1 : 2 : 3 : []
55+#+end_src
66+77+#+RESULTS:
88+: [1,2,3]
99+1010+Temos tambem o /sugar syntax/ para declarar listas da forma mais casual e esperada
1111+#+begin_src haskell
1212+[1, 2, 3]
1313+#+end_src
1414+1515+#+RESULTS:
1616+: [1,2,3]
1717+1818+Com isso, podemos aproveitar para gerar listas de forma lazy (e ate listas infinitas)
1919+#+begin_src haskell
2020+[1..10]
2121+#+end_src
2222+2323+#+RESULTS:
2424+: [1,2,3,4,5,6,7,8,9,10]
2525+2626+#+begin_src haskell
2727+:{
2828+indexa :: [a] -> Int -> a
2929+indexa xs i = head (drop i xs)
3030+:}
3131+3232+xs = [0..200]
3333+xs `indexa` 35
3434+#+end_src
3535+3636+#+RESULTS:
3737+: 35
3838+3939+#+begin_src haskell
4040+:{
4141+fatorial :: Integer -> Integer
4242+fatorial n = product [2..n]
4343+:}
4444+4545+fatorial 10
4646+#+end_src
4747+4848+#+RESULTS:
4949+: 3628800
5050+5151+** List Comprehension
5252+5353+Desta maneira eh chamada de compreensao de listas
5454+#+begin_src haskell
5555+[x | x <-[0,2..100], x `mod` 6 == 0]
5656+#+end_src
5757+5858+#+RESULTS:
5959+| 0 | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 | 66 | 72 | 78 | 84 | 90 | 96 |
6060+6161+Podemos tambem usar duas expressoes geradoras ao mesmo tempo
6262+#+begin_src haskell
6363+[(x, y) | x <-[0..5], y <-[11..16]]
6464+#+end_src
6565+6666+#+RESULTS:
6767+| 0 | 11 |
6868+| 0 | 12 |
6969+| 0 | 13 |
7070+| 0 | 14 |
7171+| 0 | 15 |
7272+| 0 | 16 |
7373+| 1 | 11 |
7474+| 1 | 12 |
7575+| 1 | 13 |
7676+| 1 | 14 |
7777+| 1 | 15 |
7878+| 1 | 16 |
7979+| 2 | 11 |
8080+| 2 | 12 |
8181+| 2 | 13 |
8282+| 2 | 14 |
8383+| 2 | 15 |
8484+| 2 | 16 |
8585+| 3 | 11 |
8686+| 3 | 12 |
8787+| 3 | 13 |
8888+| 3 | 14 |
8989+| 3 | 15 |
9090+| 3 | 16 |
9191+| 4 | 11 |
9292+| 4 | 12 |
9393+| 4 | 13 |
9494+| 4 | 14 |
9595+| 4 | 15 |
9696+| 4 | 16 |
9797+| 5 | 11 |
9898+| 5 | 12 |
9999+| 5 | 13 |
100100+| 5 | 14 |
101101+| 5 | 15 |
102102+| 5 | 16 |
103103+104104+** Concat
105105+106106+Its the same as a flatten from languages
107107+#+begin_src haskell
108108+concat [[1,2,4], [6,7,8]]
109109+#+end_src
110110+111111+#+RESULTS:
112112+| 1 | 2 | 4 | 6 | 7 | 8 |
113113+114114+** Creating ~length~ with list comprehension
115115+#+begin_src haskell
116116+tam xs = sum [1 | _ <- xs]
117117+118118+tam [1..10]
119119+#+end_src
120120+121121+#+RESULTS:
122122+: Prelude> 10
123123+124124+* Recursion
125125+Aqui em Haskell nao temos stack overflow, como as funcoes sao de forma lazy ele ira a cada vez da recursao substituir com os novos valores na expressao.
126126+Seguindo o exemplo seguinte de fatorial:
127127+#+begin_src haskell
128128+:{
129129+fatorial2 :: Integer -> Integer
130130+fatorial2 0 = 1
131131+fatorial2 n = n * fatorial2 (n - 1)
132132+:}
133133+134134+fatorial2 3
135135+#+end_src
136136+137137+#+RESULTS:
138138+: Prelude> 6
139139+140140+A execucao do ~fatorial2~ seria dessa forma:
141141+#+BEGIN_EXAMPLE
142142+= 3 * fatorial2 (3 - 1)
143143+= 3 * 2 * fatorial2 (2 - 1)
144144+= 3 * 2 * 1 * fatorial2 (1 - 1)
145145+= 3 * 2 * 1 * 1
146146+#+END_EXAMPLE
147147+148148+Com isso, o Haskell nao ira criar uma pilha de execucao como visto em outras linguagens
149149+150150+** Tail recursion
151151+Para um exemplo de tail recursion, podemos usar um exemplo para realizar o mdc
152152+#+begin_src haskell
153153+:{
154154+mdc :: Int -> Int -> Int
155155+mdc a 0 = a
156156+mdc a b = mdc b (a `mod` b)
157157+:}
158158+159159+mdc 48 18
160160+#+end_src
161161+162162+#+RESULTS:
163163+: Prelude> 6
164164+165165+Neste exemplo, diferente do modo recursivo que a cada iteracao ira ser substituido os valores e aumentando o tamanho de nossa expressao, neste exemplo de MDC a gente mantem um tamanho fixo de expressao e de pilha.
166166+O Haskell ira realizar as seguintes operacoes:
167167+#+BEGIN_EXAMPLE
168168+= mdc 48 18
169169+= mdc 18 12
170170+= mdc 12 6
171171+= mdc 6 0
172172+= 6
173173+#+END_EXAMPLE
174174+175175+* Quick Sort implementation
176176+#+begin_src haskell
177177+:{
178178+qsort :: Ord a => [a] -> [a]
179179+qsort [] = []
180180+qsort (x:xs) =
181181+ (qsort menores) ++ [x] ++ (qsort maiores)
182182+ where
183183+ menores = [e | e <- xs, e < x]
184184+ maiores = [e | e <- xs, e >= x]
185185+:}
186186+187187+qsort [6,7,5,3,4,20,4444,6,89,4]
188188+#+end_src
189189+190190+#+RESULTS:
191191+: Prelude> [3,4,4,5,6,6,7,20,89,4444]