diff options
Diffstat (limited to 'pt-br')
| -rw-r--r-- | pt-br/haskell-pt.html.markdown | 221 | 
1 files changed, 119 insertions, 102 deletions
| diff --git a/pt-br/haskell-pt.html.markdown b/pt-br/haskell-pt.html.markdown index 3d80a44f..f9f9f510 100644 --- a/pt-br/haskell-pt.html.markdown +++ b/pt-br/haskell-pt.html.markdown @@ -227,22 +227,38 @@ let fatorial n = fatorial (n - 1) * n     uma lista é `resto`  é o resto da lista.  -} -mapa mapeador [] = [] +mapa mapeador _ [] = []  mapa mapeador (primeiro : resto) = mapeador primeiro : (mapa mapeador resto) -{- Funções Anônimas são criadas com um `\` (barra invertida) -   seguido por seus argumentos! +{- Uma função anônima é uma função sem um nome. +   É uma abstração do cálculo lambda: + +   \x -> x + 1 +   λ.x (x + 1) + +   Em Haskell Barra Invertida é um jeito para +   se escrever Lambda (λ). Uma ótima pedida +   Para entender Haskell e outras linguagens como Lisp +   É estudar Cálculo Lambda, é um entendimento matemático +   mais apurado. E do ponto de vista computacional é +   bastante interessante. Em EXTRAS você encontrará +   Links para aprender Cálculo Lambda.  -} -mapa (\primeiro -> primeiro + 2) [1..5] -- [3, 4, 5, 6, 7] -{- Usar "fold" (chamado `inject` em algumas outras línguagens) com -   uma função anônima. +(\x -> x + 1) 4 -- 5 + -   <foldl1> significa <fold left> E mapeia o primeiro valor -   da lista para ser o acumulador. +{- Algumas vezes é mais conveniente usar expressões lambda +   do que definir um nome para uma função. Na matemática +   Nomes são muito simbólicos. Isso acontece bastante +   quando você estiver trabalhando `map` ou `foldl` / `foldr`  -} -foldl1 (\acc x -> acc + x) [1..5] -- 15 -foldl1 (\x y -> (x+y)/5) [7..55] -- 13.6875 + +-- Sem usar expressões anônimas ! +listaSomaUm lst = map somaUm' lst where somaUm' x = x + 1 + +-- Usando expressões anônimas ! +listaSomaUm' lst = map (\x -> x + 1) lst  ----------------------------------------------------  -- 4. Mais Funções @@ -276,144 +292,142 @@ foo 5 -- 75  {- Concertando precedência:     Haskell tem outra função chamada `$`. Isso altera a precedência     de computação. Ou seja Haskell computa o que está sendo sinalizado com $ -   da esquerda para a direita . You can use `.` and `$` to get rid of a lot -   of parentheses: +   da esquerda para a direita . Você pode usar `.` e `$` para se livrar +   de parentízação desnecessária.  -} --- Antes  (even (fatorial 3)) -- true --- Depois +-- Usando `.` e `$`  even . fatorial $ 3 -- true  ---------------------------------------------------- --- 4. More functions +-- 5. Tipos  ---------------------------------------------------- -{- Mais Sobre Funções Currificadas: se você não passar -   todos os argumentos para uma função. --} - -add a b = a + b -foo = add 10 -- foo is now a function that takes a number and adds 10 to it -foo 5 -- 15 - --- Another way to write the same thing -foo = (+10) -foo 5 -- 15 +-- Haskell é fortemente tipado e tudo tem uma assinatura típica. --- function composition --- the (.) function chains functions together. --- For example, here foo is a function that takes a value. It adds 10 to it, --- multiplies the result of that by 5, and then returns the final value. -foo = (*5) . (+10) +-- Tipos Básicos: +460 :: Integer +"music" :: String +True :: Bool --- (5 + 10) * 5 = 75 -foo 5 -- 75 +{- Funções também tem tipos. +   `not` recebe um booleano e retorna um booleano: +   not :: Bool -> Bool +-} --- fixing precedence --- Haskell has another function called `$`. This changes the precedence --- so that everything to the left of it gets computed first and then applied --- to everything on the right. You can use `.` and `$` to get rid of a lot --- of parentheses: +{- Aqui temos uma função que recebe dois argumentos +   soma :: Integer -> Integer -> Integer +-} --- before -(even (fib 7)) -- true +{- Quando você define um valor em Haskell +   uma boa prática de programação é escrever +   o TIPO acima dessa mesma. Como segue: +-} --- after -even . fib $ 7 -- true +double :: Integer -> Integer +double x = x * 2  ---------------------------------------------------- --- 5. Type signatures +-- 6. Controle de Fluxo e IF-THEN-ELSE  ---------------------------------------------------- --- Haskell has a very strong type system, and everything has a type signature. - --- Some basic types: -5 :: Integer -"hello" :: String -True :: Bool +-- Blocos IF-THEN-ELSE +let valor_alternado = if 144 `mod` 6 == 4 then "acertou" else "errou" -- errou --- Functions have types too. --- `not` takes a boolean and returns a boolean: --- not :: Bool -> Bool +-- É legal identar quando você tem múltiplos branchs para acontecer --- Here's a function that takes two arguments: --- add :: Integer -> Integer -> Integer +let valor_alternado = if 144 `mod` 6 == 4 +                      then "acertou" +                      else "errou" --- When you define a value, it's good practice to write its type above it: -double :: Integer -> Integer -double x = x * 2 +-- Blocos CASE ----------------------------------------------------- --- 6. Control Flow and If Statements ----------------------------------------------------- +{- caso <argumento> seja : +        <ajuda>  -> mostra_ajuda +        <inicia> -> inicia_programa +        <_>      -> putStrLn "ExArgumentoInvalido" --- if statements -haskell = if 1 == 1 then "awesome" else "awful" -- haskell = "awesome" +    Onde `_` Significa Qualquer Outra Coisa. +-} --- if statements can be on multiple lines too, indentation is important -haskell = if 1 == 1 -            then "awesome" -            else "awful" --- case statements: Here's how you could parse command line arguments  case args of -  "help" -> printHelp -  "start" -> startProgram -  _ -> putStrLn "bad args" +     "ajuda"  -> mostra_ajuda +     "inicia" -> inicia_programa +     _        -> putStrLn "ExArgumentoInvalido" --- Haskell doesn't have loops because it uses recursion instead. --- map applies a function over every element in an array +{- Haskell não funciona na base de loops pois ele é +   fortemente baseado em funcões recursivas e cálculo lambda +   Use `map` uma função build-in do interpretador +   para, por exemplo, mapear uma lista: +-}  map (*2) [1..5] -- [2, 4, 6, 8, 10] --- you can make a for function using map -for array func = map func array - --- and then use it +-- Você pode criar um FOR-LOOP usando map +let for array funcao = map funcao array  for [0..5] $ \i -> show i --- we could've written that like this too: +-- Ou ainda (Pesquise sobre show em Haskell):  for [0..5] show --- You can use foldl or foldr to reduce a list --- foldl <fn> <initial value> <list> + +{- foldl computação é feita esquerda para direita +   foldr computação é feita  direita para esquerda + +   Você pode usar foldl or foldr a fim de reduzir uma lista +   fold(l||r) <funcao> <valor inicial> <lista> +-} + +-- Fold Left  foldl (\x y -> 2*x + y) 4 [1,2,3] -- 43 --- This is the same as -(2 * (2 * (2 * 4 + 1) + 2) + 3) +-- Pensando Recursivamente Esquerda-Direita +(2 * (2 * (2 * 4 + 1) + 2) + 3) -- 43 --- foldl is left-handed, foldr is right- +-- Fold Right  foldr (\x y -> 2*x + y) 4 [1,2,3] -- 16 --- This is now the same as +-- Pensando Recursivamente Direita-Esquerda  (2 * 3 + (2 * 2 + (2 * 1 + 4)))  ---------------------------------------------------- --- 7. Data Types +-- 7. Declaração de Dados  ---------------------------------------------------- --- Here's how you make your own data type in Haskell - -data Color = Red | Blue | Green +{- Vamos começar definindo um tipo de +   dado que é uma cor rgb então ela +   tem valores para vermelho azul e verde +   ela é composta desses 3 comprimentos +   Vamos usar `data` e `say` que são built-in: +    +   Haskell pede que você user letra +   maiuscula para tipos (types) ou classes (Class) +    +   Por favor, visite: http://www.haskell.org/haskellwiki/Type +   E de uma olhada na fórmula genérica de declaração de dados. +-} --- Now you can use it in a function: +data Cor = Vermelho | Azul | Verde +-- say :: Color -> String -say :: Color -> String -say Red = "You are Red!" -say Blue = "You are Blue!" -say Green =  "You are Green!" +let say Vermelho = "Vermelho" +let say Azul = "Azul" +let say Verde = "Verde" --- Your data types can have parameters too: +{- O seu tipo de dados por receber parâmetros também +   vamos com um exemplo usando `data` e a Classe `Maybe`. +-}  data Maybe a = Nothing | Just a --- These are all of type Maybe -Just "hello"    -- of type `Maybe String` -Just 1          -- of type `Maybe Int` -Nothing         -- of type `Maybe a` for any `a` +-- Just e Nothing são todos derivadas de Maybe +Just "hello" -- tipo `Maybe String` +Just 1       -- tipo `Maybe Int` +Nothing      -- tipo `Maybe a` para algum `a`  ----------------------------------------------------  -- 8. Haskell IO @@ -514,18 +528,15 @@ Prelude> let foo = 1.4  Prelude> :t foo  foo :: Double -```  ----------------------------------------------------  -- 9. Mônadas  ---------------------------------------------------- +``` - ----------------------------------------------------- --- 10. Extra ----------------------------------------------------- +# Extra  Compilador e Interpretador Haskell @@ -544,10 +555,16 @@ Aplicações Haskell Muito Interessantes:  * [Bio Informática](http://www.haskell.org/haskellwiki/Applications_and_libraries/Bioinformatics)  * [Muitos Outras Aplicações](http://www.haskell.org/haskellwiki/Libraries_and_tools) +Comunidade Haskell +* [Musica das Mônadas](http://www.haskell.org/haskellwiki/Music_of_monads) +  Tutoriais:  * [Mapeadores](http://www.haskell.org/ghc/docs/6.12.2/html/libraries/containers-0.3.0.0/Data-Map.html)  * [Aprenda Haskell!](http://haskell.tailorfontela.com.br/chapters) +* [Fundação Teórica da Linguagem Haskell](http://www.haskell.org/haskellwiki/Lambda_calculus) +* [Classe Maybe](http://www.haskell.org/haskellwiki/Maybe) +* [Zvon Referência Haskell](http://www.zvon.org/other/haskell/)  Obtenha Também Haskell Wiki Book [Aqui!](https://en.wikibooks.org/wiki/Haskell) | 
