Wikilivros ptwikibooks https://pt.wikibooks.org/wiki/Wikilivros:P%C3%A1gina_principal MediaWiki 1.47.0-wmf.23 first-letter Multimédia Especial Discussão Utilizador Utilizador Discussão Wikilivros Wikilivros Discussão Ficheiro Ficheiro Discussão MediaWiki MediaWiki Discussão Predefinição Predefinição Discussão Ajuda Ajuda Discussão Categoria Categoria Discussão Tópico Tópico discussão Resumo Resumo discussão TimedText TimedText talk Módulo Módulo Discussão Evento Evento Discussão Topic Introdução à Química/Hidrocarbonetos 0 2152 589289 486278 2026-10-11T23:05:38Z Innerstream 73072 589289 wikitext text/x-wiki Hidrocarboneto é um composto químico constituído apenas por átomos de carbono e de hidrogênio. Os hidrocarbonetos naturais são compostos químicos constituídos por átomos de carbono (C) e de hidrogênio (H), aos quais se podem juntar átomos de oxigênio (O), nitrogênio (N) e enxofre (S) dando origem aos compostos orgânicos, classificados de acordo com seus grupos funcionais. São conhecidos alguns milhares de hidrocarbonetos. As diferentes características físicas são uma consequência das diferentes composições moleculares. Contudo, todos os hidrocarbonetos apresentam uma propriedade comum: oxidam-se facilmente libertando calor. Hidrocarbonetos líquidos geologicamente extraídos são chamados de petróleo (literalmente "óleo de pedra") ou óleo mineral, enquanto hidrocarbonetos geológicos gasosos são chamados de gás natural. Todos são importantes fontes de combustível. Hidrocarbonetos são de grande importância econômica porque constituem a maioria dos combustíveis fósseis (carvão, petróleo,gás natural, etc.); vários outros produtos como biocombustíveis, plásticos, ceras, solventes e óleos são compostos orgânicos cuja estrutura básica é formada por hidrocarbonetos (mas que não são hidrocarbonetos por possuírem outros átomos além do carbono e hidrogênio). == Introdução == Os hidrocarbonetos são classificados de acordo com sua saturação, que posteriormente servirá para nomeá-lo. O primeiro passo é verificar a presença de ligações duplas e triplas. Se houver, é necessário [[Introdução à Química/Cadeias carbônicas|numerar os átomos de carbono da cadeia principal]]. De acordo com a quantidade de insaturações encontradas, o hidrocarboneto receberá uma respectiva classificação. É preciso, ainda, observar a presença de ciclos. A relação entre as ligações, com os respectivos grupos de hidrocarbonetos, está listada abaixo: {| {{prettytable}} width="30%" ! width="25%" |Triplas ! width="25%" |Duplas ! width="25%" |Acíclico ! width="25%" |Cíclico |- |<center>0</center> |<center>0</center> |Alcano |Ciclano |- |<center>1</center> |<center>0</center> |Alcino |Ciclino<nowiki>*</nowiki> |- |<center>2</center> |<center>0</center> |Alcadiino ! |- |<center>3</center> |<center>0</center> |Alcatriino<nowiki>*</nowiki> ! |- |<center>0</center> |<center>1</center> |Alceno |Cicleno |- |<center>0</center> |<center>2</center> |Alcadieno |Ciclodieno<nowiki>*</nowiki> |- |<center>0</center> |<center>3</center> |Alcatrieno<nowiki>*</nowiki> |Ciclotrieno<nowiki>*</nowiki> |} <nowiki>*</nowiki>Compostos raros Há duas formas de se obter um hidrocarboneto qualquer, pela fórmula estrutural - em que cada estrutura representa um hidrocarboneto -,e pela fórmula molecular (cada fórmula pode identificar diversos hidrocarbonetos). == Pela fórmula estrutural == Utilizando-se da fórmula estrutural, é fácil identificar o hidrocarboneto. Veja alguns exemplos abaixo: <gallery> File:Pentan Skelett.svg|Cadeia acíclica<br>Nenhuma ligação tripla<br>Nenhuma ligação dupla<br>'''Alcano''' File:1-Butene.svg|Cadeia acíclica<br>Nenhuma ligação tripla<br>Uma ligação dupla<br>'''Alceno''' File:1,7-Octadiene.svg|Cadeia acíclica<br>Nenhuma ligação tripla<br>Duas ligações duplas<br>'''Alcadieno''' File:3-hexyne.png|Cadeia acíclica<br>Uma ligação tripla<br>Nenhuma ligação dupla<br>'''Alcino''' |Cadeia cíclica<br>Nenhuma ligação tripla<br>Duas ligações duplas<br>'''Ciclodieno''' File:Cyclohexyne.svg|Cadeia cíclica<br>Uma ligação tripla<br>Nenhuma ligação dupla<br>'''Ciclino''' File:Vinylacetylene-2D-skeletal.png|Cadeia acíclica<br>Uma ligação tripla<br>Uma ligação dupla<br>'''Alceno/Alcino''' </gallery> == Pela fórmula molecular == Considerando-se a fórmula molecular, encontraremos todas as possibilidade de hidrocarbonetos com tal fórmula. Para isto, utiliza-se a seguinte equação: :<math>a + 2C - H = 4x + 2y</math> Onde: *'''a''' corresponde a 2 nos compostos acíclicos e 0 nos cíclicos; *'''C''' é a quantidade de átomos de carbono da substância; *'''H''' a quantia de hidrogênios; *'''x''' o número de ligações triplas; *'''y''' o número de ligações duplas do hidrocarboneto. A tabela abaixo exibe a classificação conforme os resultados obtidos: {| {{prettytable}} width="30%" ! width="25%" |''x''<br>[triplas] ! width="25%" |''y''<br>[duplas] ! width="25%" |Acíclico<br>a=2 ! width="25%" |Cíclico<br>a=0 |- |<center>0</center> |<center>0</center> |Alcano |Ciclano |- |<center>1</center> |<center>0</center> |Alcino |Ciclino<nowiki>*</nowiki> |- |<center>2</center> |<center>0</center> |Alcadiino ! |- |<center>3</center> |<center>0</center> |Alcatriino<nowiki>*</nowiki> ! |- |<center>0</center> |<center>1</center> |Alceno |Cicleno |- |<center>0</center> |<center>2</center> |Alcadieno |Ciclodieno<nowiki>*</nowiki> |- |<center>0</center> |<center>3</center> |Alcatrieno<nowiki>*</nowiki> |Ciclotrieno<nowiki>*</nowiki> |} <nowiki>*</nowiki>Compostos raros Existem substâncias híbridas, isto é, possuem características de mais de um grupo de hidrocarbonetos. Apresentam, logo, ligações duplas e triplas (valores para ''x'' e ''y''), como é o caso do vinilacetileno (x = 1; y = 1). Se à esquerda da equação o resulado for negativo, o composto não existe. Além disto, ''x'' e ''y'' sempre pertencem ao conjunto dos números naturais. {{Quadro||pontilhado=sim |1 = Exemplos |2 = <br> {{ênfase|'''1)''' Suponhamos que o composto C<sub>8</sub>H<sub>14</sub> não seja ramificado e seja acíclico, qual suas possíveis classificações?}} [[Imagem:Oct-1-yne.svg|thumb|150px|right|C<sub>8</sub>H<sub>14</sub> (1; 0)]] [[Imagem:1,7-octadieen.png|thumb|150px|right|C<sub>8</sub>H<sub>14</sub> (0; 2)]] Por ser acíclico, assume o valor 2 para ''a'': :<math>2 + 2 \times 8 - 14 = 4x + 2y</math> :<math>4 = 4x + 2y</math> Estabelecendo os possíveis pares ordenados que satisfaçam a equação, teremos: :<math>4 = (1; 0), (0; 2)</math> Portanto, tal hidrocarboneto pode ser um alcino ou um alcadieno. {{ênfase|'''2)''' Sabendo que o composto C<sub>5</sub>H<sub>12</sub> é normal, qual sua classificação?}} Primeiramente consideraremos como acíclico: :<math>2 + 2 \times 5 - 12 = 4x + 2y</math> :<math>0 = 4x + 2y</math> [[Ficheiro:Pentane-2D-Skeletal.svg|right|150px|thumb|C<sub>5</sub>H<sub>12</sub> (0; 0)]] :<math>0 = (0;0)</math> Agora ''a'' adota o valor de zero, se tratando de um hidrocarboneto cíclico: :<math>0 + 2 \times 5 - 12 = 4x + 2y</math> :<math>-2 = 4x + 2y</math> Assim, o hidrocarboneto C<sub>5</sub>H<sub>12</sub> de cadeia normal, nunca será cíclico (já que o resultado foi menor que zero), e sempre será um alcano. }} === Regra das ligações triplas === Dependendo dos valores encontrados para x, o composto não existirá: *Para que um composto acíclico, em que C é par e <math>\frac C x = 2</math>, seja real, obrigatoriamente, y = 0; *Para qualquer outro composto, seja cíclico, acíclico com C ímpar ou acíclico com C par e <math>\frac C x > 2</math>, seja real: :<math>C - 1 \ge 2x + y</math> {{Quadro||pontilhado=sim |1 = Exemplos |2 = <br> {{ênfase|'''3)''' O composto C<sub>3</sub>H<sub>3</sub>, de cadeia normal, existe?}} :<math>2 + 2 \times 3 - 3 = x + y</math> :<math>5 = (1;1), (0;3)</math> Aplicando-se a regra das ligações triplas: :<math>2 \ge 2x + y</math> Substituindo-se pelos pares ordenados: :<math>2 \times 1 + 1 = 3</math> :<math>2 \times 0 + 3 = 3</math> Deste modo, não existe C<sub>3</sub>H<sub>3</sub>, pois 3 > 2. {{ênfase|'''4)''' Quais as possíveis insaturações para o composto C<sub>6</sub>H<sub>2</sub>, sendo este de cadeia normal?}} :<math>2 + 2 \times 6 - 2 = x + y</math> :<math>12 = (3;0), (2;2), (1;4), (0;6)</math> Para o primeiro par ordenado, teremos: :<math>\frac 6 3 = 2</math> Portanto, a combinação (3; 0) é possível. Aos demais pares: :<math>5 \ge 2 \times 2 + 2 = 6</math> :<math>5 \ge 2 \times 1 + 4 = 6</math> :<math>5 \ge 2 \times 0 + 6 = 6</math> Como 6 > 5, os pares (2;2), (1;4) e (0;6) são impossíveis para esta substância. Resta verificar se o par (3;0) é possível no caso de ser cíclico: :<math>5 \ge 2 \times 3 + 0 = 6</math> Conclui-se que, para uma cadeia normal, C<sub>6</sub>H<sub>2</sub> obrigatoriamente é um alcatriino. }} == Aromáticos == Os hidrocarbonetos aromáticos são aqueles que apresentam um anel benzênico, portanto, todos são cíclicos. Os aromáticos normalmente são designados por uma nomenclatura popular, pois a nomenclatura sistemática da IUPAC é um tanto grande para estes. Confira abaixo os principais hidrocarbonetos aromáticos e sua respectiva nomenclatura popular e sistemática: <gallery> Ficheiro:Benzene-aromatic-3D-balls.png|'''Benzeno''' Ficheiro:Naphthalene-3D-balls.png|'''Naftaleno''' (biciclo[4.4.0]deca-1,3,5,7,9-penteno) Ficheiro:Anthracene-3D-balls.png|'''Antraceno''' Ficheiro:Phenanthrene-3D-balls.png|'''Fenantreno''' Ficheiro:Tetracene-3D-balls.png|'''Tetraceno''' Ficheiro:Pyrene-3D-balls.png|'''Pireno''' Ficheiro:Triphenylene-3D-balls.png|'''Trifenileno''' </gallery> == Nomenclatura == Os compostos da química orgânica têm a seguinte nomenclatura: {{ênfase|<center>'''PREFIXO + RAIZ + SUFIXO'''</center>}} O prefixo é indicado pela quantidade de átomos de carbono na cadeia: [[Imagem:Methan Lewis.svg|150px|right|thumb|Por ter apenas um carbono, o composto acima recebe o prefixo ''met-'']] *1 carbono - '''met''' *2 carbonos - '''et''' *3 carbonos - '''prop''' *4 carbonos - '''but''' *5 carbonos - '''pent''' *6 carbonos - '''hex''' *7 carbonos - '''hept''' *8 carbonos - '''oct''' *9 carbonos - '''non''' *10 carbonos - '''dec''' Cada grupo de hidrocarbonetos tem uma raiz própria: [[Imagem:Methan Lewis.svg|150px|right|thumb|Não tendo insaturações, recebe a raiz ''-an-'' e o sufixo ''-o'' por ser hidrocarboneto: '''metano''']] {| {{prettytable}} width="20%" ! width="10%"| Grupo (par ordenado) ! width="10%"| Raiz |- |Alcanos (0;0) |'''an''' |- |Alcinos (1;0) |'''in''' |- |Alcadiinos (2;0) |'''diin''' |- |Alcatriinos (3;0) |'''triin''' |- |Alcenos (0;1) |'''en''' |- |Alcadienos (0;2) |'''dien''' |- |Alcatrienos (0;3) |'''trien''' |} Em compostos mistos, todas as raizes devem estar presentes no nome. Para os cíclicos, basta acrescentar o morfema '''ciclo''' antes do prefixo. Acíclicos que não sejam alcanos (0,0) e cíclicos que não sejam ciclanos (0,0), ciclinos (1,0) e ciclenos (0,1) devem exibir a posição da insaturação na cadeia. O sufixo comum a todos hidrocarbonetos é o sufixo '''o'''. {{ênfase|'''5)''' Quais os possíveis nomes do composto C<sub>8</sub>H<sub>14</sub>?}} :O composto tem os pares ordenados (1;0) e (0;2), já calculados no primeiro exemplo. Assim, para (1;0): *'''Prefixo''': ''oct'' *'''Raiz''': ''in'' *'''Sufixo''': ''o'' O composto recebe o nome de ''oct-n-ino'' para ''n'' a posição da insaturação da cadeia: {| class="caixaPP" style="padding:10px 10px 10px 10px; width:100%; border-color: #712F26;" |<center> {| | <math>\underbrace{ \mathbf{CH} {\color{Red}\equiv} \mathbf{C} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> | <math>\underbrace{ \mathbf{CH_3} - \mathbf{C} {\color{Red}\equiv} \mathbf{C} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> |- |<center>'''Oct-1-ino'''</center><br> |<center>'''Oct-2-ino'''</center><br> |- | <math>\underbrace{ \mathbf{CH_3} - \mathbf{CH_2} - \mathbf{C} {\color{Red}\equiv} \mathbf{C} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> | <math>\underbrace{ \mathbf{CH_3} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{C} {\color{Red}\equiv} \mathbf{C} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> |- |<center>'''Oct-3-ino'''</center> |<center>'''Oct-4-ino'''</center> |} </center> |} Para (0;2): *'''Prefixo''': ''octa'' *'''Raiz''': ''dien'' *'''Sufixo''': ''o'' O composto recebe o nome de ''octa-m,n-dieno'' para ''m'' e ''n'' a posição das insaturações da cadeia. Alguns exemplos: {| class="caixaPP" style="padding:10px 10px 10px 10px; width:100%; border-color: #712F26;" |<center> {| | <math>\underbrace{ \mathbf{CH_2} {\color{Red}=} \mathbf{C} {\color{Red}=} \mathbf{CH} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> | <math>\underbrace{ \mathbf{CH_2} {\color{Red}=} \mathbf{CH} - \mathbf{CH_2} - \mathbf{CH} {\color{Red}=} \mathbf{CH} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_3} }_{ }</math> |- |<center>'''Octa-1,2-dieno'''</center><br> |<center>'''Octa-1,4-dieno'''</center><br> |- | <math>\underbrace{ \mathbf{CH_3} - \mathbf{CH} {\color{Red}=} \mathbf{CH} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH} {\color{Red}=} \mathbf{CH_2} }_{ }</math> | <math>\underbrace{ \mathbf{CH_3} - \mathbf{CH_2} - \mathbf{CH_2} - \mathbf{CH} {\color{Red}=} \mathbf{CH} - \mathbf{CH} {\color{Red}=} \mathbf{CH} - \mathbf{CH_3} }_{ }</math> |- |<center>'''Octa-2,7-dieno'''</center> |<center>'''Octa-2,4-dieno'''</center> |} </center> |} Veja mais exemplos: <gallery> File:Pentan Skelett.svg|5C = ''pent''<br>(0;0) = ''an''<br>hidrocarboneto = ''o''<br>'''Pentano''' File:1-Butene.svg|4C = ''but''<br>(0;1) = ''1-en''<br>hidrocarboneto = ''o''<br>'''But-1-eno''' File:2-Butene.svg|4C = ''but''<br>(0;1) = ''2-en''<br>hidrocarboneto = ''o''<br>'''But-2-eno''' File:1,7-octadieen.png|8C = ''oct''<br>(0;2) = ''1,7-dien''<br>hidrocarboneto = ''o''<br>'''Octa-1,7-dieno''' File:3-hexyne.png|6C = ''hex''<br>(1;0) = ''3-in''<br>hidrocarboneto = ''o''<br>'''Hex-3-ino''' File:Cyclohexyne.svg|6C = ''hex''<br>(1;0) = ''in''<br>hidrocarboneto = ''o''<br>'''Ciclo-hexino''' File:Vinylacetylene-2D-skeletal.png|4C = ''but''<br>(1;1) = 1-en-3-in<br>hidrocarboneto = ''o''<br>'''But-1-en-3-ino''' </gallery> {{AutoCat}} 8aj907374u8ktc2wnnugl5s2jg58shr Haskell/Instalação e aritmética 0 29708 589292 448709 2026-10-12T00:15:24Z Luciérnaga de conocimiento 67836 589292 wikitext text/x-wiki == Instalando o Haskell == Haskell é uma ''linguagem de programação'', isto é, uma linguagem na qual os seres humanos podem expressar como os computadores devem se comportar. É como escrever uma receita de cozinha: você escreve a receita e o computador a executa. Para executar programas em Haskell, você precisa de um programa especial chamado ''compilador'' de Haskell. Um compilador recebe o código escrito em Haskell e o traduz para ''código de máquina'', uma linguagem mais elementar que o computador entende. Usando a analogia da cozinha, você escreve uma receita (seu programa em Haskell) e um cozinheiro (um programa compilador) faz o trabalho de combinar os ingredientes reais para preparar um prato comestível (um arquivo executável). Naturalmente, não é fácil obter a receita a partir do prato pronto (assim como não é possível obter o código Haskell a partir do executável depois que ele é compilado). Para começar, visite [https://www.haskell.org/downloads haskell.org/downloads] para consultar as instruções mais recentes. Atualmente, o método recomendado é usar [https://haskell.org/ghcup GHCup]. Use-o para instalar a versão mais recente recomendada do GHC, <code>cabal</code> (não <code>stack</code>) e o servidor de linguagem Haskell. Você deve usar <code>cabal</code> para instalar qualquer biblioteca Haskell de que precisar. Abordaremos o uso de <code>cabal</code> em detalhes em [[Haskell/Packaging]] {{body note|1= Usuários de Linux: '''É fortemente desaconselhado instalar qualquer componente relacionado ao Haskell usando os repositórios de pacotes e o gerenciador de pacotes do sistema (a menos que você esteja usando Fedora ou NixOS). Especificamente, distribuições como Arch Linux e Debian gerenciam os pacotes Haskell muito mal, o que prejudica a experiência com as ferramentas de desenvolvimento. Use GHCup e Cabal, conforme indicado acima.''' }} Para testar apenas alguns conceitos básicos de Haskell sem baixar e instalar nada, existe um [https://play.haskell.org/ ambiente de testes] que inclui alguns pacotes por padrão. A maioria das instruções deste Wikilivro também funcionará nesse ambiente, embora ele não aceite entradas do usuário. == Primeiro código == Após a instalação, escreveremos nosso primeiro código em Haskell usando o programa chamado '''GHCi''' (o 'i' significa ''interativo''). Dependendo do seu sistema operacional, siga estas etapas: No Windows: clique em Iniciar, depois em Executar, digite 'cmd' e pressione Enter. Em seguida, digite <code>ghci</code> e pressione Enter novamente. No MacOS: abra o aplicativo "Terminal", localizado na pasta "Aplicativos/Utilitários", digite <code>ghci</code> na janela que aparecerá e pressione Enter. No Linux: abra um terminal e execute <code>ghci</code>. Você deverá obter uma saída semelhante à seguinte: <pre> GHCi, version 8.10.7: http://www.haskell.org/ghc/ :? for help Prelude> </pre> A primeira parte indica a versão do GHCi e informa como obter ajuda no próprio GHCi. A parte <code>Prelude></code> é conhecida como ''prompt''. É nesse local que você digita os comandos, e o GHCi responde com os resultados. O prompt também informa que o módulo atualmente carregado é <code>Prelude</code>, que dá acesso à maioria das funções predefinidas. Agora vamos experimentar algumas operações aritméticas básicas: {{Haskell/GHCi|1= Prelude> 2 + 2 4 Prelude> 5 + 4 * 3 17 Prelude> 2 ^ 5 32 }} Esses operadores correspondem aos encontrados na maioria das outras linguagens de programação: <code>+</code> é a adição, <code>*</code> é a multiplicação e <code>^</code> é a exponenciação (elevar um número a uma potência, ou seja, <math>a ^ b</math>). Como mostra o segundo exemplo, Haskell segue a ordem convencional das operações matemáticas (por exemplo, a multiplicação é efetuada antes da adição). Agora você já sabe usar Haskell como uma calculadora. Na verdade, Haskell é ''sempre'' uma calculadora — só que muito poderosa, capaz de trabalhar não apenas com números, mas também com outros objetos, como caracteres, listas, funções, árvores e até mesmo outros programas (se você ainda não conhece esses termos, não se preocupe). Para sair do GHCi quando terminar, use <code></code> (ou simplesmente <code></code>): {{Haskell/GHCi| Prelude> Leaving GHCi. }} O GHCi é um ambiente de desenvolvimento poderoso. À medida que avançarmos, aprenderemos a carregar arquivos com código-fonte no GHCi e a avaliar diferentes partes deles. Se tudo estiver claro até aqui (caso contrário, use a página de discussão e ajude a melhorar este Wikilivro!), você estará pronto para o próximo capítulo, no qual apresentaremos alguns dos conceitos básicos de Haskell e criaremos nossas primeiras funções em Haskell. {{Auto category}} {{AutoCat}} [[Categoria:Livro/Haskell/Arquivo]] nf95pvqktly231n30n2iteo0wi1cjbo 589293 589292 2026-10-12T00:15:40Z Luciérnaga de conocimiento 67836 589293 wikitext text/x-wiki == Instalando o Haskell == Haskell é uma ''linguagem de programação'', isto é, uma linguagem na qual os seres humanos podem expressar como os computadores devem se comportar. É como escrever uma receita de cozinha: você escreve a receita e o computador a executa. Para executar programas em Haskell, você precisa de um programa especial chamado ''compilador'' de Haskell. Um compilador recebe o código escrito em Haskell e o traduz para ''código de máquina'', uma linguagem mais elementar que o computador entende. Usando a analogia da cozinha, você escreve uma receita (seu programa em Haskell) e um cozinheiro (um programa compilador) faz o trabalho de combinar os ingredientes reais para preparar um prato comestível (um arquivo executável). Naturalmente, não é fácil obter a receita a partir do prato pronto (assim como não é possível obter o código Haskell a partir do executável depois que ele é compilado). Para começar, visite [https://www.haskell.org/downloads haskell.org/downloads] para consultar as instruções mais recentes. Atualmente, o método recomendado é usar [https://haskell.org/ghcup GHCup]. Use-o para instalar a versão mais recente recomendada do GHC, <code>cabal</code> (não <code>stack</code>) e o servidor de linguagem Haskell. Você deve usar <code>cabal</code> para instalar qualquer biblioteca Haskell de que precisar. Abordaremos o uso de <code>cabal</code> em detalhes em [[Haskell/Packaging]] {{body note|1= Usuários de Linux: '''É fortemente desaconselhado instalar qualquer componente relacionado ao Haskell usando os repositórios de pacotes e o gerenciador de pacotes do sistema (a menos que você esteja usando Fedora ou NixOS). Especificamente, distribuições como Arch Linux e Debian gerenciam os pacotes Haskell muito mal, o que prejudica a experiência com as ferramentas de desenvolvimento. Use GHCup e Cabal, conforme indicado acima.''' }} Para testar apenas alguns conceitos básicos de Haskell sem baixar e instalar nada, existe um [https://play.haskell.org/ ambiente de testes] que inclui alguns pacotes por padrão. A maioria das instruções deste Wikilivro também funcionará nesse ambiente, embora ele não aceite entradas do usuário. == Primeiro código == Após a instalação, escreveremos nosso primeiro código em Haskell usando o programa chamado '''GHCi''' (o 'i' significa ''interativo''). Dependendo do seu sistema operacional, siga estas etapas: No Windows: clique em Iniciar, depois em Executar, digite 'cmd' e pressione Enter. Em seguida, digite <code>ghci</code> e pressione Enter novamente. No MacOS: abra o aplicativo "Terminal", localizado na pasta "Aplicativos/Utilitários", digite <code>ghci</code> na janela que aparecerá e pressione Enter. No Linux: abra um terminal e execute <code>ghci</code>. Você deverá obter uma saída semelhante à seguinte: <pre> GHCi, version 8.10.7: http://www.haskell.org/ghc/ :? for help Prelude> </pre> A primeira parte indica a versão do GHCi e informa como obter ajuda no próprio GHCi. A parte <code>Prelude></code> é conhecida como ''prompt''. É nesse local que você digita os comandos, e o GHCi responde com os resultados. O prompt também informa que o módulo atualmente carregado é <code>Prelude</code>, que dá acesso à maioria das funções predefinidas. Agora vamos experimentar algumas operações aritméticas básicas: {{HaskellGHCi|1= Prelude> 2 + 2 4 Prelude> 5 + 4 * 3 17 Prelude> 2 ^ 5 32 }} Esses operadores correspondem aos encontrados na maioria das outras linguagens de programação: <code>+</code> é a adição, <code>*</code> é a multiplicação e <code>^</code> é a exponenciação (elevar um número a uma potência, ou seja, <math>a ^ b</math>). Como mostra o segundo exemplo, Haskell segue a ordem convencional das operações matemáticas (por exemplo, a multiplicação é efetuada antes da adição). Agora você já sabe usar Haskell como uma calculadora. Na verdade, Haskell é ''sempre'' uma calculadora — só que muito poderosa, capaz de trabalhar não apenas com números, mas também com outros objetos, como caracteres, listas, funções, árvores e até mesmo outros programas (se você ainda não conhece esses termos, não se preocupe). Para sair do GHCi quando terminar, use <code></code> (ou simplesmente <code></code>): {{HaskellGHCi| Prelude> Leaving GHCi. }} O GHCi é um ambiente de desenvolvimento poderoso. À medida que avançarmos, aprenderemos a carregar arquivos com código-fonte no GHCi e a avaliar diferentes partes deles. Se tudo estiver claro até aqui (caso contrário, use a página de discussão e ajude a melhorar este Wikilivro!), você estará pronto para o próximo capítulo, no qual apresentaremos alguns dos conceitos básicos de Haskell e criaremos nossas primeiras funções em Haskell. {{Auto category}} {{AutoCat}} [[Categoria:Livro/Haskell/Arquivo]] 2lt55ckel7zr96eokdhkn17rqvcrb6o 589294 589293 2026-10-12T00:19:26Z Luciérnaga de conocimiento 67836 589294 wikitext text/x-wiki == Instalando o Haskell == Haskell é uma ''linguagem de programação'', isto é, uma linguagem na qual os seres humanos podem expressar como os computadores devem se comportar. É como escrever uma receita de cozinha: você escreve a receita e o computador a executa. Para executar programas em Haskell, você precisa de um programa especial chamado ''compilador'' de Haskell. Um compilador recebe o código escrito em Haskell e o traduz para ''código de máquina'', uma linguagem mais elementar que o computador entende. Usando a analogia da cozinha, você escreve uma receita (seu programa em Haskell) e um cozinheiro (um programa compilador) faz o trabalho de combinar os ingredientes reais para preparar um prato comestível (um arquivo executável). Naturalmente, não é fácil obter a receita a partir do prato pronto (assim como não é possível obter o código Haskell a partir do executável depois que ele é compilado). Para começar, visite [https://www.haskell.org/downloads haskell.org/downloads] para consultar as instruções mais recentes. Atualmente, o método recomendado é usar [https://haskell.org/ghcup GHCup]. Use-o para instalar a versão mais recente recomendada do GHC, <code>cabal</code> (não <code>stack</code>) e o servidor de linguagem Haskell. Você deve usar <code>cabal</code> para instalar qualquer biblioteca Haskell de que precisar. Abordaremos o uso de <code>cabal</code> em detalhes em [[Haskell/Packaging]] {{Nota no corpo|1= Usuários de Linux: '''É fortemente desaconselhado instalar qualquer componente relacionado ao Haskell usando os repositórios de pacotes e o gerenciador de pacotes do sistema (a menos que você esteja usando Fedora ou NixOS). Especificamente, distribuições como Arch Linux e Debian gerenciam os pacotes Haskell muito mal, o que prejudica a experiência com as ferramentas de desenvolvimento. Use GHCup e Cabal, conforme indicado acima.''' }} Para testar apenas alguns conceitos básicos de Haskell sem baixar e instalar nada, existe um [https://play.haskell.org/ ambiente de testes] que inclui alguns pacotes por padrão. A maioria das instruções deste Wikilivro também funcionará nesse ambiente, embora ele não aceite entradas do usuário. == Primeiro código == Após a instalação, escreveremos nosso primeiro código em Haskell usando o programa chamado '''GHCi''' (o 'i' significa ''interativo''). Dependendo do seu sistema operacional, siga estas etapas: No Windows: clique em Iniciar, depois em Executar, digite 'cmd' e pressione Enter. Em seguida, digite <code>ghci</code> e pressione Enter novamente. No MacOS: abra o aplicativo "Terminal", localizado na pasta "Aplicativos/Utilitários", digite <code>ghci</code> na janela que aparecerá e pressione Enter. No Linux: abra um terminal e execute <code>ghci</code>. Você deverá obter uma saída semelhante à seguinte: <pre> GHCi, version 8.10.7: http://www.haskell.org/ghc/ :? for help Prelude> </pre> A primeira parte indica a versão do GHCi e informa como obter ajuda no próprio GHCi. A parte <code>Prelude></code> é conhecida como ''prompt''. É nesse local que você digita os comandos, e o GHCi responde com os resultados. O prompt também informa que o módulo atualmente carregado é <code>Prelude</code>, que dá acesso à maioria das funções predefinidas. Agora vamos experimentar algumas operações aritméticas básicas: {{HaskellGHCi|1= Prelude> 2 + 2 4 Prelude> 5 + 4 * 3 17 Prelude> 2 ^ 5 32 }} Esses operadores correspondem aos encontrados na maioria das outras linguagens de programação: <code>+</code> é a adição, <code>*</code> é a multiplicação e <code>^</code> é a exponenciação (elevar um número a uma potência, ou seja, <math>a ^ b</math>). Como mostra o segundo exemplo, Haskell segue a ordem convencional das operações matemáticas (por exemplo, a multiplicação é efetuada antes da adição). Agora você já sabe usar Haskell como uma calculadora. Na verdade, Haskell é ''sempre'' uma calculadora — só que muito poderosa, capaz de trabalhar não apenas com números, mas também com outros objetos, como caracteres, listas, funções, árvores e até mesmo outros programas (se você ainda não conhece esses termos, não se preocupe). Para sair do GHCi quando terminar, use <code></code> (ou simplesmente <code></code>): {{HaskellGHCi| Prelude> Leaving GHCi. }} O GHCi é um ambiente de desenvolvimento poderoso. À medida que avançarmos, aprenderemos a carregar arquivos com código-fonte no GHCi e a avaliar diferentes partes deles. Se tudo estiver claro até aqui (caso contrário, use a página de discussão e ajude a melhorar este Wikilivro!), você estará pronto para o próximo capítulo, no qual apresentaremos alguns dos conceitos básicos de Haskell e criaremos nossas primeiras funções em Haskell. {{Auto category}} {{AutoCat}} [[Categoria:Livro/Haskell/Arquivo]] 155kl42uult3tur1lr5hqlqdq2ecag7 589299 589294 2026-10-12T00:28:17Z Luciérnaga de conocimiento 67836 589299 wikitext text/x-wiki == Instalando o Haskell == Haskell é uma ''linguagem de programação'', isto é, uma linguagem na qual os seres humanos podem expressar como os computadores devem se comportar. É como escrever uma receita de cozinha: você escreve a receita e o computador a executa. Para executar programas em Haskell, você precisa de um programa especial chamado ''compilador'' de Haskell. Um compilador recebe o código escrito em Haskell e o traduz para ''código de máquina'', uma linguagem mais elementar que o computador entende. Usando a analogia da cozinha, você escreve uma receita (seu programa em Haskell) e um cozinheiro (um programa compilador) faz o trabalho de combinar os ingredientes reais para preparar um prato comestível (um arquivo executável). Naturalmente, não é fácil obter a receita a partir do prato pronto (assim como não é possível obter o código Haskell a partir do executável depois que ele é compilado). Para começar, visite [https://www.haskell.org/downloads haskell.org/downloads] para consultar as instruções mais recentes. Atualmente, o método recomendado é usar [https://haskell.org/ghcup GHCup]. Use-o para instalar a versão mais recente recomendada do GHC, <code>cabal</code> (não <code>stack</code>) e o servidor de linguagem Haskell. Você deve usar <code>cabal</code> para instalar qualquer biblioteca Haskell de que precisar. Abordaremos o uso de <code>cabal</code> em detalhes em [[Haskell/Packaging]] {{Nota no corpo|1= Usuários de Linux: '''É fortemente desaconselhado instalar qualquer componente relacionado ao Haskell usando os repositórios de pacotes e o gerenciador de pacotes do sistema (a menos que você esteja usando Fedora ou NixOS). Especificamente, distribuições como Arch Linux e Debian gerenciam os pacotes Haskell muito mal, o que prejudica a experiência com as ferramentas de desenvolvimento. Use GHCup e Cabal, conforme indicado acima.''' }} Para testar apenas alguns conceitos básicos de Haskell sem baixar e instalar nada, existe um [https://play.haskell.org/ ambiente de testes] que inclui alguns pacotes por padrão. A maioria das instruções deste Wikilivro também funcionará nesse ambiente, embora ele não aceite entradas do usuário. == Primeiro código == Após a instalação, escreveremos nosso primeiro código em Haskell usando o programa chamado '''GHCi''' (o 'i' significa ''interativo''). Dependendo do seu sistema operacional, siga estas etapas: No Windows: clique em Iniciar, depois em Executar, digite 'cmd' e pressione Enter. Em seguida, digite <code>ghci</code> e pressione Enter novamente. No MacOS: abra o aplicativo "Terminal", localizado na pasta "Aplicativos/Utilitários", digite <code>ghci</code> na janela que aparecerá e pressione Enter. No Linux: abra um terminal e execute <code>ghci</code>. Você deverá obter uma saída semelhante à seguinte: <pre> GHCi, version 8.10.7: http://www.haskell.org/ghc/ :? for help Prelude> </pre> A primeira parte indica a versão do GHCi e informa como obter ajuda no próprio GHCi. A parte <code>Prelude></code> é conhecida como ''prompt''. É nesse local que você digita os comandos, e o GHCi responde com os resultados. O prompt também informa que o módulo atualmente carregado é <code>Prelude</code>, que dá acesso à maioria das funções predefinidas. Agora vamos experimentar algumas operações aritméticas básicas: {{HaskellGHCi|1= Prelude> 2 + 2 4 Prelude> 5 + 4 * 3 17 Prelude> 2 ^ 5 32 }} Esses operadores correspondem aos encontrados na maioria das outras linguagens de programação: <code>+</code> é a adição, <code>*</code> é a multiplicação e <code>^</code> é a exponenciação (elevar um número a uma potência, ou seja, <math>a ^ b</math>). Como mostra o segundo exemplo, Haskell segue a ordem convencional das operações matemáticas (por exemplo, a multiplicação é efetuada antes da adição). Agora você já sabe usar Haskell como uma calculadora. Na verdade, Haskell é ''sempre'' uma calculadora — só que muito poderosa, capaz de trabalhar não apenas com números, mas também com outros objetos, como caracteres, listas, funções, árvores e até mesmo outros programas (se você ainda não conhece esses termos, não se preocupe). Para sair do GHCi quando terminar, use <code></code> (ou simplesmente <code></code>): {{HaskellGHCi| Prelude> Leaving GHCi. }} O GHCi é um ambiente de desenvolvimento poderoso. À medida que avançarmos, aprenderemos a carregar arquivos com código-fonte no GHCi e a avaliar diferentes partes deles. Se tudo estiver claro até aqui (caso contrário, use a página de discussão e ajude a melhorar este Wikilivro!), você estará pronto para o próximo capítulo, no qual apresentaremos alguns dos conceitos básicos de Haskell e criaremos nossas primeiras funções em Haskell. {{AutoCat}} [[Categoria:Livro/Haskell/Arquivo]] gejf9p44uxh9wqjvfvhjx75mbt0ufxb Haskell/Variáveis e funções 0 29858 589300 497016 2026-10-12T00:29:22Z Luciérnaga de conocimiento 67836 589300 wikitext text/x-wiki {{Em tradução}} {{clear}} {{HaskellÍndice|Introdução}} ''Todos os exemplos deste capítulo pode ser salvos num arquivo e executados usando o GHC. Não inclua "Prelude>" em nenhum dos exemplos. Quando este comando aparecer, quer dizer que o código seguinte foi rodado no GHCi. Quando não houver o comando, basta copiar o código inteiro.'' == Variáveis == No capítulo passado, usamos o GHCi como uma calculadora, o que é tão prático apenas para contas curtas. Para grandes cálculos e para escrever um programa em Haskell, geralmente temos que acompanhar e verificar resultados intermediários. Podemos fazer isso atribuindo nomes. Chamas as chamadas ''variáveis''. Quando um programa é executado, cada variável é substituída por um ''valor'' ao qual ela se refere. Por exemplo, considere o seguinte {{HaskellGHCi|1= Prelude> 3.141592653 * 5^2 78.539816325 }} Este foi o cálculo aproximado da área de um círculo de raio <code>5</code>, de acordo com a fórmula <math>A = \pi r^2</math>. Claro que se torna um processo bastante trabalhoso escrever todos os dígitos de <math>\pi \approx 3,141592653</math>, ou mesmo lembrar os primeiros 5. Por isso, para evitar repetições podemos fazer com a máquina se lembre destes valores uma única vez para que possamos usá-los sempre que necessário. Essa abstração nos deixa livre para focar em outras partes mais importantes. No caso deste exemplo, Haskell já possui uma variável chamada <code>pi</code> que armazena mais de 15 dígitos de <math>\pi</math>, o que deixa o código mais claro e ainda ganhamos em precisão nos resultados. {{HaskellGHCi|1= Prelude> pi 3.141592653589793 Prelude> pi * 5^2 78.53981633974483 }} Perceba que a variável <code>pi</code> e seu valor, <code>3.141592653589793</code>, trocados entre si nos cálculos. == Arquivos de código em Haskell == Além de fazer cálculos esporadicamente no GHCi, você pode salvar seus códigos num arquivo Haskell, que são arquivos de texto com a extensão <tt>.hs</tt>. É recomendável usar um editor de texto próprio para programação (cf. [[w:Editor de texto|artigo da Wikipédia sobre editores de texto]]). A grande maioria deles possuem a capacidade ''realçar a sintaxe'', isto é, colorir o código fonte de modo a facilitar a leitura. Vim e Emacs são duas opções bastante populares entre programadores. Para ajudar na organização, crie também um novo diretório (uma pasta de arquivos) em seu computador para salvar os arquivos Haskell que você cria quando estiver resolvendo os exercícios deste livro. Vamos lá, crie um diretório chamado <tt>HaskellWikibook</tt>, por exemplo, e dentro dele, um arquivo chamado <tt>Varfun.hs</tt> contendo o seguinte código: <syntaxhighlight lang = "haskell"> r = 5.0 </syntaxhighlight> Este programa define a variável <code>r</code> como sendo o valor <code>5.0</code>. Nota: certifique-se de que não há espaços em branco no começo das linhas, porque Haskell é sensível a espaços. Depois abra um terminal no diretório <tt>HaskellWikibook</tt> que você criou, execute o GHCi e carregue o arquivo <tt>Varfun.hs</tt> usando o comando <code>:load</code>: {{HaskellGHCi|1= Prelude> :load Varfun.hs [1 of 1] Compiling Main ( Varfun.hs, interpreted ) Ok, modules loaded: Main. }} É bom saber que <code>:load</code> pode ser abreviado para <code>:l</code>: <code>:l Varfun.hs</code>. Se o GHCi retornar um erro como <code>Could not find module 'Varfun.hs'</code>, isso quer dizer que você provavelmente está no diretório errado. Tente o comando <code>:cd</code> para mudar o diretório corrente de dentro do GHCi (por exemplo, <code>:cd HaskellWikibook</code>). Depois que o arquivo estiver carregado na sessão do GHCi, você vai ver a linha de comando mudar de "Prelude" para "*Main". Agora você pode usar a varíavel <code>r</code> que você definiu no arquivo. {{HaskellGHCi|1= *Main> r 5.0 *Main> pi * r^2 78.53981633974483 }} Acabamos de calcular a área de um círculo de raio 5,0 usando a fórmula <math>\pi r^2</math>. O que aconteceu aqui é que usamos <code>r</code> que definimos no arquivo <tt>Varfun.hs</tt>, e <code>pi</code>, que já está definido em outro lugar. Agora, vamos fazer esse valor ser mais fácil de ser acessado ao definirmos um nome para ele também. Abra o arquivo novamente e mude seu conteúdo para: <syntaxhighlight lang = "haskell"> r = 5.0 area = pi * r ^ 2 </syntaxhighlight> Salve-e e recarregue-o no GHCi usando <code>:reload</code>, ou simplesmente <code>:r</code>: {{HaskellGHCi|1= *Main> :reload Compiling Main ( Varfun.hs, interpreted ) Ok, modules loaded: Main. *Main> }} Agora temos duas variávels: <code>r</code> e <code>area</code>. {{HaskellGHCi|1= *Main> area 78.53981633974483 *Main> area / r 15.707963267948966 }} {{nota|A palavra <code>let</code> é o que deveríamos usar para definir novas variáveis diretamente no GHCi, sem precisar editar um arquivo de código. Mesmo que possa ser prático fazer isso, nem sempre é o caso para tarefas mais complexas. É preferível usar arquivos nesses casos.}} == Comentários == Além do código em si, arquivos de código fonte podem conter texto conhecidos como ''cometários'', que são ignorados pelo compilador. Em Haskell existem dois tipos de comentários. Primeiro, aqueles que começam com <code>--</code> e que vão até o final da linha: <syntaxhighlight lang = "haskell"> x = 5 -- x is 5. y = 6 -- y is 6. -- z = 7 -- z is not defined. </syntaxhighlight> Nestes casos, <code>x</code> e <code>y</code> são realmente definidos no código, mas <code>z</code> não é. O segundo tipo do comentário é deliminado por <code>{- ... -}</code> e podem se abranger mais de uma linha: <syntaxhighlight lang = "haskell"> answer = 2 * {- bloco de cometário de mais de uma linha e... -} 3 {- comentário no meio da linha -} * 7 </syntaxhighlight> Comentários são usados para explicar partes de um programa ou para fazer qualquer tipo de anotação acerca de algum contexto. É importante frisar que exagerar na quantidade de comentários pode, na verdade, dificultar a leitura do código em si, e comentários desatualizados podem também gerar confusões. == Variáveis em linguagens imperativas == Os leitores familiares com linguagens de programação imperativa perceberão que as variáveis em Haskell se comportam de maneira bem diferente que as variáveis em C, por exemplo. Se você não possui experiência prévia com programação, pode pular esta seção, apesar de que ela pode te ajudar a entender as situações em que pessoas comparam o comportamento de Haskell em relação a outras linguagens. Muitos livros sobre Haskell fazem isso, por exemplo. ''Programação imperativa'' trata as variáveis como posições na memória da máquina. Essa abordagem está relacionada com o funcionamento básico de um computador. Programas imperativos dizem explicitamente ao computador o que devem fazer. Linguagens de alto nível, que podem estar bastante distantes destes conceitos, ainda retém parte deles no sentido de que ainda usam esse padrão de programação "passo-a-passo". Em contraste a isso, ''programação funcional'' proporciona uma maneira diferente de pensar, usando termos matemáticos e deixando de lado as instruções diretas ao computador, que são traduzidas apenas compilador para algo que o computador possa interpretar e processar. Vejamos um exemplo. O código a seguir não funcionaria em Haskell: <syntaxhighlight lang = "haskell"> r = 5 r = 2 </syntaxhighlight> Um programador de linguagens imperativas leria isto como sendo: primeiro, definir <code>r = 5</code> e depois redefinir para <code>r = 2</code>. Em Haskell, entretanto, o compilador responderia este código com um erro: "múltiplas declarações de <code>r</code>". Dentro de um escopo definido, uma variável de Haskell é definida uma única vez, e sua definição não pode mudar. As variáveis de Haskell parecem ''invariáveis'', mas a verdade é que elas se comportam como variáveis matemáticas. Na Matemática, você nunca vê uma variável mudar de valor num mesmo problema, e a mesma coisa acontece em Haskell. De forma mais precisa, as variáveis de Haskell são ''imutáveis'': elas variam apenas de acordo com os datos que entramos no programa. Não podemos definir <code>r</code> de dois jeitos diferentes num mesmo código, mas podemos mudar este valor se mudarmos de arquivo. Vamos mudar o código acima para: <syntaxhighlight lang = "haskell"> r = 2.0 area = pi * r ^ 2 </syntaxhighlight> Claro que vai funcionar. Mudamos <code>r</code> no único lugar em que ele está definido, e isso muda seu valor em todo o resto do programa. Em problemas reais, os programas em Haskell deixam ''alguns'' valores indefinidos no código. Esses valores são definidos mais tarde, quando o programa adquire dados de um arquivo ou ação externa. Mas por enquanto, vamos nos ater a definir variáveis internamente. Vamos aprender sobre interações com o mundo exterior no capítulos futuros. Aqui temos mais um exemplo da grande diferença entre Haskell com as linguagens imperativas: <syntaxhighlight lang = "haskell"> r = r + 1 </syntaxhighlight> Em vez de "incrementar o valor de <code>r</code>", isto é, atualizar o valor já armazenado na memória, este código em Haskell é a definição recursiva e <code>r</code>, ou seja, ele foi definido em termos de si mesmo. Não se preocupe, pois explicaremos [[Haskell/Recurssão|recurssão]] mais tarde. Neste caso específico, se <code>r</code> tiver sido definido com algum valor anterior, o compilador retornaria uma mensagem de erro, como explicamos anteriormente. Se <code>r</code> tiver sido definido com um valor de 5, fazer <code>r = r + 1</code> é o mesmo que tentar dizer que <math>5 = 5 + 1</math> na Matemática, o que está obviamente errado. Já que os valores não mudam dentro de um mesmo programa, variáveis podem ser definidas na ordem em que quisermos. Por exemplo, os dois códigos a seguir são exatamente a mesma coisa: {|border="0" |- ||<syntaxhighlight lang = "haskell"> y = x * 2 x = 3 </syntaxhighlight> ||<syntaxhighlight lang = "haskell"> x = 3 y = x * 2 </syntaxhighlight> |} Em Haskell não temos essa noção de que "<code>x</code> foi declarado antes de <code>y</code>", ou o contrário. Claro, para usarmos <code>y</code> ainda precisamos do valor de <code>x</code>, mas a ordem não nos interessam, e nem ao compilador. == Funções == Mudar o programa todas as vezes em que quisermos calcular a área de um círculo diferente é tedioso e nos limita a um círculo por vez. Poderíamos calcular duas áreas duplicando todas as contas em nosso código, definindo <code>r2</code> e <code>area2</code><ref group=nota>Podemos ver aqui que os nomes de variáveis podem contar números e letras. Entretanto, toda variável ''deve'' começar com um letra minúscula, que pode ser seguida por outras letras (também maiúsculas), números, traço (_) ou apóstrofe (').</ref> <syntaxhighlight lang = "haskell"> r = 5 area = pi * r ^ 2 r2 = 3 area2 = pi * r2 ^ 2 </syntaxhighlight> Para evitarmos essa repetição incessante, é preferível simplesmente adicionar uma ''função'' para calcular a área e aplicá-la a diferentes raios. Uma ''função'' recebe um ''argumento'' (ou ''parâmetro'') e retorna um resultado, exatamente como na Matemática. Em Haskell, as funções são definidas da mesma forma que as variáveis, exceto que temos que dizer quais são seus argumentos do lado esquerdo da expressão. Por exemplo, o código a seguir define <code>area</code>, cujo argumento é <code>r</code>: <syntaxhighlight lang = "haskell"> area r = pi * r ^ 2 </syntaxhighlight> Observe a sintáxe: o nome da função vem primeiro (<code>area</code>), seguido de um espaço em branco e de seu argumento (<code>r</code>). Depois vem o sinal <code>=</code>, e a definição da função, que usa o argumento de entrada em seu cálculo. Agora podemos testar diferentes valores de raio e ''chamar'' a função com eles. Salve o código acima num arquivo, abra-o no GHCi, e experimente: {{HaskellGHCi|1= *Main> area 5 78.53981633974483 *Main> area 3 28.274333882308138 *Main> area 17 907.9202768874502 }} Acabamos de ''chamar'' a função com diferentes valores e calculamos a área de três círculos diferentes. Matematicamente, o calculo da área pode ser representado por <math>A(r) = \pi \cdot r ^ 2</math>. Para calcular as áreas, faríamos <math>A(5) = 78.54</math> ou <math>A(3) = 28.27</math>. Haskell também funciona com parênteses, mas eles são geralmente omitidos por convenção para deixar o código menos carregado de símbolos e mais legível. Mesmo assim, parênteses ainda são usados para agrupar ''expressões'' (qualquer código que retorne algum valor) que devem ser calculadas todas juntas. Veja como as seguintes expressões são interpretadas de formas diferentes: <syntaxhighlight lang = "haskell"> 5 * 3 + 2 -- 15 + 2 = 17 (multiplicação feita antes da adição) 5 * (3 + 2) -- 5 * 5 = 25 (parenteses forçam a adição a ser computada primeiro) area 5 * 3 -- (area 5) * 3 area (5 * 3) -- area 15 </syntaxhighlight> Da mesma forma que a multiplicação acontece antes que a adição, perceba que as funções de Haskell tem hierarquia de ''precedência'' maior que qualquer outro operador, seja <code>+</code> ou <code>*</code>, por exemplo. == Avaliação de expressões == O que exatamente acontece quando entramos uma expressão no GHCi? Depois que pressionamos "enter", ela é avaliada. Isso significa que cada função vai ser substituída por sua definição e as contas serão realizadas até que um único valor final reste. Por exemplo, ao executarmos <code>area 5</code> o seguinte acontece: <syntaxhighlight lang=haskell> area 5 -- todos 'r' do lado direito serão substituidos por '5' pi * 5 ^ 2 -- 'pi' será substituido por um valor aproximado 3.141592653589793 * 5 ^ 2 -- a operação de potenciação '5 ^ 2' será realizada 3.141592653589793 * 25 -- a operação de multiplicação será realizada 78.53981633974483 -- resultado final </syntaxhighlight> Quando usamos o GHCi, o resultado de ''aplicar'' ou ''chamar'' a função, que segue o procedimento acima, vai aparecer na tela. Agora, mais algumas funções: <syntaxhighlight lang = "haskell"> dobrar x = 2 * x quadruplicar x = double (double x) quadrado x = x * x metade x = x / 2 </syntaxhighlight> {{HaskellExercícios|1= * Explique como GHCi avaliaria <code>quadruplicar 5</code>}. * Defina uma função que subtraia 12 da metade de seu argumento.}} == Parâmetros múltiplos == Funções também podem ter mais que um argumento. Por exemplo, para calcular a área de um retângulo precisamos de seu comprimento e de sua largura: <syntaxhighlight lang = "haskell"> areaRetang a b = a * b </syntaxhighlight> {{HaskellGHCi|1= *Main> areaRetang 5 10 50 }} Outro exemplo é a área de um triângulo, <math>A = \frac{bh}{2}</math>: <syntaxhighlight lang="haskell"> areaTriang b h = (b * h) / 2 </syntaxhighlight> {{HaskellGHCi|1= *Main> areaTriang 3 9 13.5 }} Como você pode ver, os argumentos são separados por espaços. É por isso que as vezes você precisa usar parênteses para agrupar expressões. Por exemplo, não se pode escrever o quádruplo de um valor como sendo <syntaxhighlight lang = "haskell"> quadruple x = double double x -- error </syntaxhighlight> Isso aplicaria a função <code>double</code> sobre dois argumentos: <code>double</code> e <code>x</code>. É possível, sim, que ''funções sejam argumentos de outras funções'', como veremos mais tarde, mas isso não é o que queremos aqui. Para fazer esta função funcionar precisamos de parênteses: <syntaxhighlight lang = "haskell"> quadruple x = double (double x) </syntaxhighlight> Os argumento são sempre passados na ordem em que aparecem. Por exemplo: <syntaxhighlight lang = "haskell"> menos x y = x - y </syntaxhighlight> {{HaskellGHCi|1= *Main> menos 10 5 5 *Main> menos 5 10 -5 }} Aqui, <code>menos 10 5</code> avalia a expressão <code>10 - 5</code>, enquanto que <code>menos 5 10</code> avalia <code>5 - 10</code> devido a mudança na ordem do argumentos. {{HaskellExercícios|1= * Escreva uma função para calcular o volume de uma caixa. * Aproximadamente, de quantas pedras as famosas pirâmides de Gizé feitas? Dica: você vai precisar estimar o volume da pirâmide e o volume de cada bloco de pedra. }} == Combinando funções == Claro que você pode usar outras funções para definir suas próprias, bem como você já o fez usando adição, <code>+</code>, ou multiplicação, <code>*</code>. Na verdade, operadores também são definidos como funções em Haskell. Por exemplo, para calcular a área de um quadrado, podemos reutlizar a função que calcula a área de um retângulo: <syntaxhighlight lang = "haskell"> areaRetang a b = a b areaQuad l = areaRetang l l </syntaxhighlight> {{HaskellGHCi|1= *Main> areaQuad 5 25 }} Afinal de contas, um quadrado é um retângulo de lados iguais. {{HaskellExercícios|1= * Escreva uma função que calcule o volume de um cilindro. O volume de um cilindro é a área da base, que é um círculo, multiplicada pela altura. Como você já programou a função da área de um círculo neste capítulo, você pode reutilizá-la aqui.}} == Definindo funções locais == === Usando <code>where</code> === Quando definimos uma função, às vezes precisamos calcular valores intermediários, mas que são ''locais'' e usados apenas dentro daquela função. Considere a [[w:teorema de Herão|fórmula de Herão]]: <math>A = \sqrt{p(p-a)(p-b)(p-c)}</math>, sendo <math>p</math> o metade do perímetro do triângulo. Este é o cálculo da área de um triângulo de lados <code>a</code>, <code>b</code> e <code>c</code>: <syntaxhighlight lang = "haskell"> herao a b c = sqrt (s * (s - a) * (s - b) * (s - c)) where s = (a + b + c) / 2 </syntaxhighlight> A variável <code>s</code> representa a metade do perímetro. Seria tedioso e propenso a erros se tivéssemos que escrever <code>(a + b + c)/2</code> toda vez que precisássemos deste valor dentro de <code>herao</code>. <code>sqrt</code> calcula a raiz quadrada do seu argumento (lembre-se de ''square root'', no inglês). Simplesmente escrever as definições separadamente não funcionaria. Veja: <syntaxhighlight lang = "haskell"> herao a b c = sqrt (p * (p - a) * (p - b) * (p - c)) p = (a + b + c) / 2 -- a, b, and c are not defined here </syntaxhighlight> O compilador reclamaria que <code>a</code>, <code>b</code> e <code>c</code> só estão disponíveis no lado direito de <code>herao</code>, enquanto que a definição de <code>s</code> não faz parte do lado direito de <code>herao</code>. Para que ela seja embutida lá, usamos a palavra-chave <code>where</code>. Perceba que tanto <code>where</code> quanto a definição de <code>s</code> estão ''indentadas'' por 4 espaços em branco. Isso é importante para delimitar o que está dentro do que. Vejamos outros exemplos do uso de <code>where</code>: <syntaxhighlight lang = "haskell"> areaTriangTrig a b c = c * altura / 2 -- usando trigonometria where cosa = (b ^ 2 + c ^ 2 - a ^ 2) / (2 * b * c) sina = sqrt (1 - cosa ^ 2) altura = b * sina areaTriangHerao a b c = resultado -- usa a fórmula de Herão where resulto = sqrt (p * (p - a) * (p - b) * (p - c)) p = (a + b + c) / 2 </syntaxhighlight> == Escopo == Observe atentamente o exemplo anterior: perceba que usamos as variáveis <code>a</code>, <code>b</code>, <code>c</code> duas vezes, em cada função definida. Como pode isso? Considere o seguinte procedimento no GHCi: {{HaskellGHCi|1= Prelude> let r = 0 Prelude> let area r = pi * r ^ 2 Prelude> area 5 78.53981633974483 }} Seria estranho se retornasse <code>0</code> para as áreas por causa da definição anterior de <code>let r = 0</code>. Isso não acontece porque na segunta vez que digitamos <code>r</code> estamos nos referindo a um <code>r</code> ''diferente''. Parece confuso, mas pense no seguinte: muitas pessoas se chamam João, mesmo assim, numa situação em que há apenas um João presente, podemos falar "João" sem nenhuma confusão. Em programação, essa noção de contexto é chamada de ''[[w:Escopo (computação)|escopo]]''. Não vamos nos aprofundar nos detalhes técnicos que envolvem o escope por agora, mas tenha em mente que o valor de um parâmetro é exatamente aquilo que você passa à função, independente de como você o chamou na definição da função. Assim sendo, nomear as variáveis de modo apropriado ajuda bastante a leitura do código por humanos. == Resumo == # Variáveis armazenam valores (que podem ser qualquer expressão em Haskell). # Variáveis não mudam seus valores dentro de um mesmo escopo. # Funções são úteis para escrever programas reutilizáveis. # Funções podem aceitar mais de um parâmetro. == Notas == <references group="nota"/> ivwpc5slq457d62sddywfhypvpihr0m Haskell/Verdadeiro ou falso 0 92993 589291 472897 2026-10-12T00:14:45Z Luciérnaga de conocimiento 67836 589291 wikitext text/x-wiki {{Em tradução}} {{clear}} {{HaskellÍndice|Introdução}} == Igualdade e outras comparaçãoes == No capítulo usamos sinais de igualdade para definir variáveis e funções em Haskell desta forma: <syntaxhighlight lang = "haskell"> r = 5 </syntaxhighlight> Isso significa que durante a avaliação do programa, todas as ocorrências de <code>r</code> são substituídas por <code>5</code> dentro do mesmo escopo. De modo similar, ao avaliar <syntaxhighlight lang = "haskell"> f x = x + 3 </syntaxhighlight> todas os ocorrências de <code>f</code> seguidas de um número (o argumento de <code>f</code>), são substituídas por tal valor mais três. Na Matemática, o sinal de igualdade é usado de forma diferente. Considere o seguinte problema: {{Exercícios|1= Resolva o seguinte problema: <math>x+3=5</math>. }} Neste caso, o problema não representar <math>5</math> como sendo <math>x+3</math> ou vice-versa. Na verdade, temos uma ''proposição'' de que um número <math>x</math>, quando somado a 3, resulta em 5. Resolver a equação significa achar qual valor de <math>x</math>, se é que existe um, torna a proposição verdadeira. Neste exemplo simples, uma simples manipulação algébrica nos mostra que <math>x=2</math>, isto é, <math>2</math> é o número que satisfaz a proposição, pois <math>2+3=5</math>. Comparar valores para verificar se são iguais é algo bastante útil para a programação. Na verdade, é algum bastante elementar e necessário. Em Haskell, tais testes se parecem bastante com um equação. Entretanto, já que o sinal de igual já está sendo usado para definir alguma coisa, Haskell usa um sinal ''duplo'' de igualdade, <code>==</code>, para fazer comparações. Veja: {{HaskellGHCi|1= Prelude> 2 + 3 == 5 True }} Aqui, GHCi retorna <code>True</code> (''verdadeiro'', em inglês) porque <math>2 + 3</math> é igual a <math>5</math>. E se a equação não for verdadeira? {{HaskellGHCi|1= Prelude> 7 + 3 == 5 False }} O resultado é <code>False</code> (''falso'', em inglês). Agora vamos usar a função <code>f</code> definimos no começo deste capítulo: {{HaskellGHCi|1= Prelude> let f x = x + 3 Prelude> f 2 == 5 True }} Como esperado. Já que <code>f 2</code> é avaliado como sendo <code>2 + 3</code>, que resulta em <code>5</code>, só poderíamos esperar que <code>5 == 5</code> retornasse <code>True</code>. Nós também podemos comparar dois valores numéricos para saber qual é maior. Haskell possui vários operadores para esses testes: <code><</code> para ''menor que''; <code>></code>, ''maior que''; <code><=</code>, ''menor que ou igual a''; e <code>>=</code>, ''maior que ou igual a''. Esses testes funcionam exatamente como <code>==</code>, ''igual a''. Por exemplo, poderíamos usar <code><</code> juntamente com a função <code>area</code> do capítulo anterior para saber se um círculo com um certo raio tem área menor que um outro valor. {{HaskellGHCi|1= Prelude> let area r = pi * r ^ 2 Prelude> area 5 < 50 False }} == Valores booleanos == O que acontece quando GHCi tem que determinar se essas comparações são verdadeiras ou falsas? Considere um caso diferente. Se entrarmos com uma expressão aritmética no GHCi, ela é ''avaliada'', e o resultado numérico aparece na tela: {{HaskellGHCi|1= Prelude> 2 + 2 4 }} Se substituirmos, na comparação, o valor final da expressão aritmética, algo parecido acontece: {{HaskellGHCi|1= Prelude> 2 == 2 True }} Enquanto o "4" retornado primeiro representa a contagem de alguma coisa, o "Verdadeiro" é um ''valor'' que representa a verdade de uma certa proposição. Tais valores são conhecidos como '''booleanos'''.<ref group=nota>Este termo foi escolhido em homenagem ao matemático britânico [[w:George Boole|George Boole]].</ref> Naturalmente, apenas dois valores são possíveis, os quais já nos foram apresentados: <code>True</code> e <code>False</code>. == Introdução a tipos de dados == <code>True</code> e <code>False</code> são valores reais, não apenas uma analogia. Em Haskell, valores booleanos tem o mesmo ''status'' que valores numéricos, e podemos manipulá-los de formas semelhantes. Um exemplo trivial: {{HaskellGHCi|1= Prelude> True == True True Prelude> True == False False }} <code>True</code> é, de fato, igual a <code>True</code>, and <code>True</code> não é igual a <code>False</code>. Agora responda: é possível dizer se <code>2</code> é igual a <code>True</code>? {{HaskellGHCi|1= Prelude> 2 == True <interactive>:1:0: No instance for (Num Bool) arising from the literal ‘2’ at <interactive>:1:0 Possible fix: add an instance declaration for (Num Bool) In the first argument of ‘(==)’, namely ‘2’ In the expression: 2 == True In an equation for ‘it’: it = 2 == True }} Temos um erro no compilador. Na verdade, a pergunta original sequer faze sentido. Não se pode comparar um número com algo que não é um número, ou um booleano com algo não-booleano. Haskell possui essa noção incorporada em si, e a mensagem de erro acima, apesar de longa e um pouco intimidadora, diz exatamente isso: há um número (<code>Num</code>) do lado esquerdo de <code>==</code>, então esperava-se um número do lado direito também; contudo, um booleano (<code>Bool</code>) não é um número, então o teste de igualdade falha. Fica claro, então, que valores são separados em '''tipo''', e que esses tipos definem os limites do que podemos ou não fazer com tais valores. <code>True</code> e <code>False</code> são valores do tipo <code>Bool</code>. Já o <code>2</code> é um caso um pouco mais complicado, porque existem vários tipos de números na computação, bem como na matemática (apesar de não serem equivalentes). Mas no fim, ainda é um dado <code>Num</code>. De forma geral, essa característica de limitação é de grande valor, porque podemos usar isso a nosso favor para controlar o comportamento dos nossos programas, criando regras que impedem o uso do programa com tipos que ''não fazem sentido'', o que garante a funcionamento do correto do que desenvolver. Voltaremos a este tópico sobre tipos mais tarde, pois eles são uma parte importante da linguagem Haskell. == Operadores infixos == Um teste de igualdade, como <code>2 == 2 </code>, também é uma expressão, bem como uma operação aritmética também o é, como <code>2 + 2</code>. Ambos os casos são avaliados basicamente da mesma maneira. Quando digitamos <code>2 == 2</code> numa sessão do GHCi, ele "responde" com <code>True</code>, pois simplesmente avaliou a expressão. Na verdade, o operador <code>==</code> é uma função de dois argumentos (o lado direito e o lado esquerdo da igualdade). Só que seu uso é diferente: Haskell permite que funções de dois argumentos sejam escritas como ''operadores infixos'', ou seja, que sejam escritas ''entre'' seus dois argumentos. Quando o nome da função é, na verdade, caracteres não-alfanuméricos (<code>==</code>, por exemplo), usá-las como operadores infixos é a forma mais comum. Se você deseja usá-las da forma padrão, ou seja, como ''operadores prefixos'' (com o nome da função antes dos argumentos), elas devem ser cercadas por parênteses. Veja: {{HaskellGHCi|1= Prelude> 4 + 9 == 13 True Prelude> (==) (4 + 9) 13 True }} É possível converter um booleano em outro também, usando ''negação''. <code>not</code> é a função de negação: converte <code>True</code> para <code>False</code>, e <code>False</code> para <code>True</code>. {{HaskellGHCi|1= Prelude> not (5 * 2 == 10) False }} Haskell já possui o operador de diferença: <code>/=</code>, ''não é igual a''. Entretanto, poderíamos definí-lo facilmente usando <code>not</code> e <code>==</code>: <syntaxhighlight lang = "haskell"> x /= y = not (x == y) </syntaxhighlight> Note que podemos usar a notação de operadores infixos até mesmo na hora de definí-los. Além disso, um operador pode ser definido a partir de qualquer símbolo [[w:ASCII|ASCII]]. === Outras operações booleanas === Existem outras operações com booleanos bastante úteis que necessárias: ''ou'' e ''e''. A operação ''A ou B'' resulta em verdadeiro se ''A'', ou ''B'', ou ambos forem verdadeiros. Ela é definida como sendo o operador <code>(||)</code> em Haskell: {{HaskellGHCi|1= Prelude> True {{!!}} True True Prelude> True {{!!}} False True Prelude> False {{!!}} True True Prelude> False {{!!}} False False }} A operação ''A e B'' resulta em verdadeiro se ''A'' e ''B'' forem verdadeiros. Ela é definida com osendo o operador <code>(&&)</code>: {{HaskellGHCi|1= Prelude> True && True True Prelude> True && False False Prelude> False && True False Prelude> False && False False }} == Guardas == Os programas escritos em Haskell geralmente usam operadores booleanos numa sintaxe bastante conveniente e abreviada. Quando uma mesma lógica é escrita com uma sintaxe diferente, chamamos isso de [[w:Açúcar sintático|''açúcar sintático'']]. Quer dizer que o código se torna mais "aprazível ao paladar humano". É bom lembra-se deste termo, pois ele aparece bastante nos materiais sobre Haskell. Um desses "açúcares", é o que chamamos de ''guardas'', e que usa booleanos para facilitar a implementação de função de maneira bem simples. Primeiro, vamos implementar a função de valor absoluto para números reais, também chamada de [[w:Função modular|função modular ou módulo]]. Sua definição matemática é que: se um número for positivo, seu módulo é ele mesmo; se um número for negativo, seu módulo é seu oposto, ou 0 menos ele mesmo. <math>\text{abs}(x) = |x| = \begin{cases} x, & \mbox{se } x \ge 0 \\ -x, & \mbox{se } x < 0. \end{cases} </math> Nesta função, a expressão usada para calcular <math>|x|</math> depende do próprio valor de <math>x</math>. Se <math>x \ge 0</math> for verdadeiro, então usamos a primeira expressão; se for falso, a segunda. Para expressar esse processo de decisão em Haskell, usamos guardas, sendo que a função ficaria assim:<ref group=nota>Esta função já está disponível nas bibliotecas padrões de Haskell, chamada de <code>abs</code>. Não há necessidade de reimplementá-la.</ref> <syntaxhighlight lang="haskell"> absoluto x | x < 0 = 0 - x | otherwise = x </syntaxhighlight> É interessante ver que o código acima se parece bastante com a definição matemática. Vamos por partes: * Começamos com uma definição normal de uma função. Primeiro o nome, <code>absoluto</code>, depois definindo a quantidade de argumentos que ela aceita, <code>x</code>. * Em vez de usar o sinal <code>=</code> e começar a escrever a definição, nós escrevemos duas alternativas de comportamento logo a baixo.<ref group=nota>Na verdade, poderíamos escrever tudo numa linha só, como <code>f x | caso 1 | caso 2</code>, mas é sempre preferível quebrar linhas para facilitar a leitura.</ref> São essas alternativas que chamamos de ''guardas''. Deve-se lembrar que a indentação (os espaços em branco antes de <code>|</code>) não são opcionais, e são usados para mostrar que as guardas estão dentro do escopo da definição de <code>absoluto</code>. * Cada guarda começa com uma barra vertical, <code>|</code>. Depois dela, deve-se escrever uma expressão que resulte num booleano, também chamada de condição booleana ou ''predicado''. Ela é seguida pelo resto da definição, que começa a partir de <code>=</code>. A definição descrita numa guarda só será avaliada se, e somente se o predicato for avaliado como <code>True</code>. * O case de <code>otherwise</code> é avaliado quando nenhum dos outros casos acima for verdadeiro. Nestes caso, se <code>x</code> não for menor que zero, então ele só pode ser maior que, ou igual a zero. O predicado da última guarda, portanto, poderia ser <code>x >= 0</code>, mas você geralmente vai ver <code>otherwise</code> como um caso para aceitar todas as outras condições não descritas nas guardas anteriores. {{nota|Não há nada de mágico por trás de <code>otherwise</code>. Na verdade, ele é definido simplesmente como sendo <code>otherwise {{=}} True</code>. Isso quer dizer que sempre que <code>otherwise</code> for avaliado, sempre retornará <code>True</code> e, portanto, a definição descrita em sua guarda será executada.}} Perceba que escrevemos <code>0 - x</code> em vez de <code>-x</code>. O que acontece é que <code>-</code> ''não é'' uma função de um argumento que retorna <code>0 - x</code>. Na verdade, trata-se de uma abreviação sintática. Mesmo sendo bastante útil, ela geralmente causa conflito quando usada em conjunto com a função <code>(-)</code>, que o operador da subtração. Faça um teste você mesmo no GHCi: calcule 3 menos -4, sem usar parênteses. É para evitar este tipo de problema que decidimos escrever de forma explícita <code>0 - x</code>. ==Guardas e <code>where</code>== Usar <code>where</code> dentro de uma função com guardas é bastante comum. Por exemplo: para saber quantas soluções reais uma [[w:Equação quadrática|equação de segundo grau]] possui, do tipo <math>ax^2+bx+c=0</math>, temos que calcular seu discriminante, <math>\Delta = b^2 - 4ac</math>. Se ele for maior que zero, há duas raízes reais; se for nulo, há uma; se for menor que zero, nenhuma. Uma função <code>numSolsReais</code> em Haskell para calcular esta quantidade, poderia ser escrita assim: <syntaxhighlight lang = "haskell"> numSolsReais a b c | delta > 0 = 2 | delta == 0 = 1 | otherwise = 0 where delta = b^2 - 4*a*c </syntaxhighlight> ==Notas== <references group=nota/> 63892laoatkrc42ab16msrmum95ngso Guia Prático de Implantação: Alpine Linux, Docker e Immich 0 131593 589290 2026-10-11T23:42:13Z ~2026-54705-73 73073 Criou a página com "== Índice == * [[/Capa/]] * [[/Prefácio/]] * [[/Introdução/]] * [[/Capítulo 1: Instalação e Configuração Base do Alpine Linux/]] * [[/Capítulo 2: Segurança, Acesso Remoto e Gerenciamento/]] * [[/Capítulo 3: Conteinerização com Docker e Docker Compose/]] * [[/Capítulo 4: Deploy e Execução da Aplicação Immich/]] * [[/Capítulo 5: Verificação, Pós-Instalação e Considerações Finais/]] {{livro novo}} {{Ficha do livro |Etapa = 1..." 589290 wikitext text/x-wiki == Índice == * [[/Capa/]] * [[/Prefácio/]] * [[/Introdução/]] * [[/Capítulo 1: Instalação e Configuração Base do Alpine Linux/]] * [[/Capítulo 2: Segurança, Acesso Remoto e Gerenciamento/]] * [[/Capítulo 3: Conteinerização com Docker e Docker Compose/]] * [[/Capítulo 4: Deploy e Execução da Aplicação Immich/]] * [[/Capítulo 5: Verificação, Pós-Instalação e Considerações Finais/]] {{livro novo}} {{Ficha do livro |Etapa = 1 <!-- Coloque um número de 0 até 8 --> |Nível educacional 1 = |Tema 1 = <!-- Antes de preencher este campo, opine na página [[Wikilivros Discussão:Biblioteca#Proposta]] --> |CDD 1 = 004 <!-- Código da Classificação Decimal de Dewey para Computação/Software --> |CDU 1 = 004 <!-- Código da Classificação Decimal Universal --> |CBC 1 = <!-- Coloque o código da Classificação da Biblioteca do Congresso se aplicável --> }} {{AutoCat}} bptb2fuuxy34tlule7ps18kk8yfwzo7 Predefinição:Nota no corpo 10 131594 589295 2026-10-12T00:20:07Z Luciérnaga de conocimiento 67836 Criou a página com "<div style="border:solid #999 1px;background:#F8F8F8;color: #202122;max-width:70%;padding:0.25em 1em;margin:0.5em auto;align:center;overflow:auto"> ''Nota'' {{{1}}} </div> <noinclude>[[Category:Note templates|{{PAGENAME}}]]</noinclude>" 589295 wikitext text/x-wiki <div style="border:solid #999 1px;background:#F8F8F8;color: #202122;max-width:70%;padding:0.25em 1em;margin:0.5em auto;align:center;overflow:auto"> ''Nota'' {{{1}}} </div> <noinclude>[[Category:Note templates|{{PAGENAME}}]]</noinclude> 626i3saksw31s553bw9zjuusunpwslw 589296 589295 2026-10-12T00:21:48Z Luciérnaga de conocimiento 67836 589296 wikitext text/x-wiki <div style="border:solid #999 1px;background:#F8F8F8;color: #202122;max-width:70%;padding:0.25em 1em;margin:0.5em auto;align:center;overflow:auto"> ''Nota'' {{{1}}} </div> <noinclude>[[Categoria:Predefinições de notas|{{PAGENAME}}]]</noinclude> rggq2kyp3j2cbevvf74zlo5c6o3t15v Categoria:Predefinições de notas 14 131595 589297 2026-10-12T00:23:00Z Luciérnaga de conocimiento 67836 Criou a página com "[[Categoria:Predefinições de informação]]" 589297 wikitext text/x-wiki [[Categoria:Predefinições de informação]] f1b3z2i8f0hrpmjkc3iu0b2mwhzgk8l Categoria:Predefinições de informação 14 131596 589298 2026-10-12T00:23:23Z Luciérnaga de conocimiento 67836 Criou a página com "[[Categoria:Predefinições]]" 589298 wikitext text/x-wiki [[Categoria:Predefinições]] 9rqapm7gg9sklqqnsj5josev0auttsg