* Assinatura de funcao As assinaturas de funcoes servem para declarar a tipagem que nossa funcao ira usar, retornar e os parametros que utilizaremos na funcao. #+begin_src haskell :{ raizes2Grau :: Floating a => a -> a -> a -> (a, a) raizes2Grau a b c = (((-b) + sqrt(b^(2 :: Int) - 4 * a * c))/ (2 * a), ((-b) - sqrt(b^(2 :: Int) - 4 * a * c))/ (2 * a)) :} raizes2Grau 2 3 5 #+end_src #+RESULTS: : (NaN,NaN) ** Clausula "where" 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. #+begin_src haskell :{ raizes2GrauV2 :: Floating a => a -> a -> a -> (a, a) raizes2GrauV2 a b c = (x1, x2) where x1 = ((-b) + sqDelta) / (2 * a) x2 = ((-b) - sqDelta) / (2 * a) sqDelta = sqrt delta delta = b^2 - 4 * a * c :} raizes2GrauV2 2 3 (-5) #+end_src #+RESULTS: : (1.0,-2.5) ** Clausula "let in" Ela eh bem semelhando a clausula ~where~, porem o escopo das definicoes declaradas soh sao acessadas dentro do escopo do ~in~. #+begin_src haskell :{ cylinder :: (RealFloat a) => a -> a -> a cylinder r h = let sideArea = 2 * pi * r * h topArea = pi * r ^2 in sideArea + 2 * topArea :} cylinder 2 5 #+end_src #+RESULTS: : Prelude> 87.96459430051421 Tambem eh possivel declarar funcoes dentro do escopo do ~let~ #+begin_src haskell [let square x = x * x in (square 5, square 3, square 2)] #+end_src #+RESULTS: