Baixe o app para aproveitar ainda mais
Prévia do material em texto
Pontif́ıcia Universidade Católica de Minas Gerais PUC-MG Haskell: Puramente funcional Pedro Igor Martins dos Reis Belo Horizonte 2022 Pedro Igor Martins dos Reis Haskell: Puramente funcional Orientador: Otaviano Francisco Neves Belo Horizonte 2022 Sumário 1 Introdução 2 2 História e Cronologia 2 3 Paradigmas e suas caracteŕısticas 5 4 Caracteŕısticas da linguagem 5 4.1 Compiladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5 Haskell em comparação a outras linguagens 7 5.1 Similares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.1.1 Miranda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.1.2 Nix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.2 Contrastantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.2.1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6 Tutorial de instalação 10 7 Projetos relevantes 11 7.1 Shellcheck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 7.2 Xmonad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 7.3 Tidal Cycles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 7.4 Sigma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8 Conclusão 13 Lista de Figuras 1 Logo oficial de Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Logo oficial Haskell 98 . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3 Logo anterior Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 Logo oficial Miranda . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5 Logo oficial NixOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6 Logo comum da linguagem C . . . . . . . . . . . . . . . . . . . . . . 10 7 ShellCheck com o editor Emacs . . . . . . . . . . . . . . . . . . . . . 12 8 Xmonad na prática . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 9 Logo oficial do Tidal Cycles . . . . . . . . . . . . . . . . . . . . . . . 12 10 haskell.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1 Resumo Haskell é uma linguagem de programação funcional, de tipagem estática, impĺıcita e preguiçosa, projetada na década de 90 para fins acadêmicos, pes- quisa e aplicações industriais. Foi influenciada pelas linguagens Miranda e ML (ou Meta Linguagem). 1 Introdução Este documento aborda brevemente a respeito da linguagem de programação fun- cional Haskell, onde é explicado e exemplificado suas principais caracteŕısticas e funcionalidades. Em suma, os objetivos centrais do desenvolvimento desta lingua- gem seriam a viabilidade para o ensino e pesquisa, sua gratuidade, universalidade e evitar a dissemelhança desnecessária de outras linguagens funcionais. Outrossim, o assunto a seguir não apenas é de interesse do pesquisador, mas também proporcionará uma vasta gama de conhecimentos a respeito do tema. Além disto, o estudo presente será utilizado como seminário para a disciplina de Linguagens de Programação. Para alcançar o objetivo deste trabalho, foram realizadas pesquisas bibli- ográficas sobre a linguagem, testes com programas disponibilizados na internet com o compilador Glasgow Haskell Compiler. Além disto, para praticar os conhecimentos adquiridos e a fim de obter uma apresentação mais visual, foi configurado o geren- ciador de janelas Xmonad, este que seu funcionamento é intŕınseco com Haskell. O desenvolvimento deste trabalho tem o propósito de analisar e comprovar as caracteŕısticas defendidas da linguagem, como redigibilidade, confiabilidade, reu- sabilidade, modificabilidade e alta portabilidade. Ademais, diferenciar-se de outras linguagens conhecidas, por exemplo, C, Java, Python e, por fim, contrastar sua usabilidade em projetos acadêmicos modernos. Figura 1: Logo oficial de Haskell 2 História e Cronologia A primeira versão do Haskell foi oficialmente lançada no dia primeiro de abril de 1990. No entanto, sua origem prática iniciou-se no final da década de 30, onde foi desenvolvido o Cálculo Lambda, por Alonzo Church e Stephen Kleene. Este fundamento matemático serviu de base para todas a linguagens posteriores, mas 2 foi considerado a primeira linguagem de programação funcional, tratando-se de um modelo matemático que descreve relações entre funções, porém não foi criada para uso em computadores. Em 1956 foi desenvolvida a linguagem de programação Lisp, segunda lingua- gem de programação do mundo, inspirada parcialmente pelo teorema do λ-cálculo, projetada por John McCarthy. Por meio desta última tiveram-se muitos diale- tos como o Scheme e o Clojure. Lisp não é considerada puramente funcional pois agrega componentes de linguagens de imperativas como, por exemplo, efeitos cola- terais, mudanças de estado e comandos de controle. Pouco tempo depois, em 1960, Peter Landin criou a primeira linguagem puramente funcional, denominada de ISWIN ou If you see What I mean. 1(defun oper-to-string (oper) 2(let ((str-res "nil")) 3(setf str-res 4(cond 5((eq oper #’+) "+") 6((eq oper #’-) "-") 7((eq oper #’*) "*"))))) Listing 1: Exemplo Lisp Nos anos 70, por meio da Funcional Programming, foi posśıvel desenvolver utilizando funções de alto ńıvel (high-order function), que permitem receber outras funções como argumento ou retornar uma como resultado. Posteriormente, é in- troduzido o conceito de polimorfismo de funções e a capacitância de inferência de tipo de dados com ML ou Meta Linguagem. Ulteriormente, Miranda demonstra pioneirismo com a avaliação preguiçosa. Na década de 80, houve a ascensão da programação funcional, em que havia muitas pesquisas em torno de técnicas deste tipo de escrita, onde a mais conhecida foi a avaliação preguiçosa. Tal teorema pode ser explicado da seguinte forma: a avaliação é atrasada até um ponto onde o resultado é considerado necessário. Neste peŕıodo, muitas linguagens surgiram, sendo algumas delas Miranda, LML (Lazy ML), Orwell, Alfl, Id, Clean, Ponder e Daisy. Devido à carência de patroćınio e apoio, em 1987 havia o problema que se tinha muitas linguagens de programação funcionais que não eram maduras ou acesśıveis o suficiente. Desta forma, em setembro do mesmo ano, ocorreu uma reunião sobre o assunto, denominada “FPCA’87 Conference”, que surgiu a ideia de desenvolver uma linguagem robusta e que continha as melhores técnicas funcionais. Resultado da comissão supracitada, foi batizada a linguagem Haskell, tendo como base a linguagem Miranda, que era mais “completa” que as demais. O nome foi uma homenagem ao matemático Haskell Brooks Curry, por contribuir com as teorias fundamentais da programação funcional. O grupo de desenvolvedores da linguagem tinham o slogan informal de “Evitar o sucesso a todo custo”. Por conta disto, Haskell era mais encontrada em ambientes de estudo como Universidades. A cronologia pode ser dividida em 3 pontos principais, sendo eles, Haskell 1.0, que seria a primeira versão oficial, definida em 1990. Desta versão, 4 outras definições foram consolidadas, 1.1, 1.2, 1.3 e 1.4. Importante detalhar mais sobre a versão 1.3, esta que apresentou diversas melhorias e mudanças, sendo elas: 3 1. Tipos de dados algébricos; 2. Classes construtoras; 3. Expansão de funcionalidades I/O. Em 92, foi criado e lançado o Glasgow Haskell Compiler, compilador de código aberto mais utilizado por desenvolvedores de Haskell até a atualidade. Pouco tempo depois, em fevereiro de 1999, surgiu o Haskell 98, um relatório que continha especificações de uma versão mais estável e portátil, com uma biblioteca focada no ensino e com a possibilidade de expansão para incrementações e a implementação do GHC. Figura 2: Logo oficial Haskell 98 Em 2010, foi publicada a última versão oficial de Haskell, informalmente chamada de ’Haskell Prime’ (Haskell’), que além de adicionar diversos atributos muito utilizados,foi importante por trazer atualizações, sendo elas: 1. Módulos hierárquicos; 2. Ligações com outras linguagens como C; 3. Novos padrões de sintaxe e regras de interferência; 4. Especificação de uma diretriz da linguagem e correções na gramática formal. O último lançamento é considerado o marco mais importante da linguagem, considerado o padrão atual para a maioria dos desenvolvedores. Figura 3: Logo anterior Haskell 4 3 Paradigmas e suas caracteŕısticas Haskell é conhecida por ser uma linguagem puramente funcional, isso significa que se trata de uma computação avaliativa de funções matemáticas, onde a pureza implica que uma função que não retorna valores que possam provocar efeitos colaterais. Tal caracteŕıstica permite uma sintaxe elegante e concisa, sendo posśıvel observar códigos enxutos e de fácil compreensão. Como dito anteriormente, a base para o paradigma funcional é o Cálculo Lambda ou Cálculo-λ, este que é um sistema formal de definições, aplicação e re- cursão de funções. Completo ao ponto de ser equivalente em poder computacional a máquina de Turing, este modelo é bastante eficiente para prototipação, especificação e aprendizado. Por conta disto, é melhor empregado em ambientes acadêmicos do que em softwares privados. Outro ponto importante seria o estado compartilhado, referindo-se a valores que possam ser acessados em mais de um ponto da aplicação. Assim, não é necessário chamar a variável dentro de um dos argumentos de uma determinada função. O paradigma funcional possui funções puras, ou seja, funções sem efeito cola- teral. Assim, ao executar a mesma função com a mesma entrada, a resposta sempre será a mesma. Ademais, diminui as chances de bugs devido à inexistência de estados e mutabilidade. No entanto, dificulta o gerenciamento de memória e realiza um uso consideravelmente elevado de Garbage Collector. Vale ressaltar que o paradigma também apresenta pontos negativos, por exemplo, as funções puras podem causar uma menor legibilidade do código, os valo- res imutáveis com recursões ocasionam uma redução de desempenho e a reutilização é mais complicada que outros modelos, levando a uma refatoração constante. Lin- guagens deste grupo apresentam uma curva de aprendizado superior em comparação a linguagens imperativas como C, principalmente para iniciantes no campo funci- onal. Portanto, Haskell e semelhantes não seriam práticas ou válidas para todas situações. 4 Caracteŕısticas da linguagem Haskell não apenas é ligado ao paradigma funcional, mas também é o melhor exemplo prático da norma, carregando consigo as vantagens e desvantagens já mencionadas. Logo, é posśıvel observar uma construção eficiente de programas e um alto ńıvel de abstração. 1Haskell > "Hello World" 2"Hello World" :: [Char] Listing 2: Primeiro programa em Haskell A linguagem permite inferências de tipos, contudo, não é exigido explicitar seu identificador. Também é posśıvel que um mesmo identificador seja declarado em partes diferentes do programa, representando diferentes entidades. Haskell conta com uma checagem forte de tipos de dados, sendo alguns deles: int, integer, float, double, char e String e também possui tipos compostos como: tuplas e listas. 5 As estruturas de dados mais utilizadas são as tuplas e listas, onde tupla seria uma sequência finita de elementos de tipos possivelmente diferentes, separada por v́ırgulas e delimitadas por parênteses. É comumente escrita como (T1, T2, . . . , ), por exemplo: 1("Pedro Igor",False,10,’V’,1.3) :: (String, Bool, Int, Char, Float) Listing 3: Exemplo de Tuplas Haskell é senśıvel à ordem posta de cada elemento nas tuplas, mesmo con- tendo os mesmos valores, em posições diferentes, não são reconhecidas como equiva- lentes. Este comportamento é semelhante aos pontos no plano cartesiano ou a um sistema de coordenadas. Como citado, o paradigma funcional produz uma abundância de lixo na memória. Como os dados são imutáveis, é necessário criar valores para guardar o resultado de cada operação. De maneira contraintuitiva, em Haskell, quanto maior o percentual do código for lixo, mais rápido ele opera. A proximidade entre Haskell e a matemática é elevada, podendo ser observada na semelhança da escrita de funções entre ambos universos: 1f x -- f(x) 2f x y -- f(x,y) 3f (g x) -- f(g(x)) 4f x (g y) -- f(x,g(y)) 5f x * g y -- f(x) * g(y) Listing 4: Hasell e Matemática Além disso, é importante ressaltar sobre a atenção às regras de layout de Haskell, semelhante ao Python, é necessário um cuidado adicional com tabulações ou espaços, pois as separações entre expressões são realizadas pela indentação. Tal comportamento pode ser visto no exemplo abaixo: 1a = b + c 2where 3{ 4b = 15 5c = 20 6} 7d = c - b 4.1 Compiladores A linguagem pode ser interpretada ou compilada, sendo os três principais compi- ladores: Glasgow Haskell Compiler, Haskell User’s Gofer System e o Helium. O primeiro é um interpretador e compilador, escrito em Haskell, capaz de produzir programas mais rápidos, porém é menos portável, mais lento e exige mais memória que os demais. Por outro lado, o Hugs é apenas um interpretador portável e leve, escrito em C e recomendado para iniciantes. Caso o programador deseje algo mais simples, pode utilizar compiladores online como tryHaskell.org e Replit. 6 5 Haskell em comparação a outras linguagens Atualmente, no mercado existem cerca de 1300 linguagens de programação. Neste tópico será mostrado semelhanças e diferenças da linguagem Haskell com algumas conhecidas no mercado. 5.1 Similares 5.1.1 Miranda Miranda é a linguagem antecessora a Haskell, baseada nas linguagens ML e Hope e é considerada a primeira linguagem funcional a ser comercialmente suportada. A semelhança entre Haskell e Miranda é elevada, porém a primeira demonstra maior facilidade de aplicação. 1-- Miranda 2fib :: (num, num, num) -> [char] 3fib(num,a,b) = show(a+b) ++ " " ++ fib((num - 1),(a+b),a), if(a > 0 & num > 1) 4= show(a) ++ " " ++ show(b) ++ " " ++ show(a+b) ++ " " ++ fib((num - 1),(a+b),b), if(a == 0) 5= [], otherwise 6 7showFib :: num -> [char] 8showFib num = "\n" ++ fib(num, 0, 1) ++ "\n" 9 10-- Haskell 11fib 0 = 0 12fib 1 = 1 13fib n 14| even n = f1 * (f1 + 2 * f2) 15| n ‘mod‘ 4 == 1 = (2 * f1 + f2) * (2 * f1 - f2) + 2 16| otherwise = (2 * f1 + f2) * (2 * f1 - f2) - 2 17where k = n ‘div‘ 2 18f1 = fib k 19f2 = fib (k-1) Listing 5: Sequência de Fibonacci Figura 4: Logo oficial Miranda 5.1.2 Nix Nix é um gerenciador de pacotes multiplataforma que é uma implantação puramente funcional, desenvolvido em 2003 e não possui a mesma finalidade ou origem, mas apresenta uma sintaxe muito semelhante com Haskell. Em ambos, a análise das expressões é fundamental para o funcionamento e as configurações do tipo Nix são tão modulares quanto, por exemplo: 7 1{ config, pkgs, ... }: 2{ 3imports = 4[ 5./myPantheon.nix 6./hardware-configuration.nix 7]; 8 9boot = 10{ 11loader = 12{ 13systemd-boot.enable = true; 14efi.canTouchEfiVariables = true; 15}; 16consoleLogLevel = 0; 17initrd.verbose = false; 18plymouth.enable = true; 19initrd.kernelModules = [ "amdgpu" ]; 20}; 21 22services = 23{ 24pipewire = 25{ 26enable = true; 27pulse.enable = true; 28}; 29fwupd.enable = true; 30printing.enable = true; 31resolved.enable = true; 32geoclue2.enable = true; 33power-profiles-daemon.enable = true; 34}; 35 36# [...] 37} Listing 6: Arquivo de configuração para NixOS Figura 5: Logo oficial NixOS 5.2 Contrastantes 5.2.1 C A linguagem C foi desenvolvida em 1972 por Ken Thompson e Dennis Ritchie, sendo imperativa e extremamente relevante para o mercado. Por ela, diversas outras foram 8 criadas, como Python, Java, C++, C Sharp, etc. Haskell é muito comparada com C devido a importância que cada uma possui em seu devido paradigma.As principais vantagens da primeira seriam a curva de aprendizagem menor, compatibilidade e praticidade, já que C exige muito pouca memória e na maioria das situações é capaz de extrair mais desempenho da máquina. Como dito anteriormente, uma das vantagens de Haskell sobre outras lingua- gens seriam os códigos enxutos. Um exemplo clássico seria o algoritmo de QuickSort, podendo ser escrito de inúmeras formas diferentes. O exemplar abaixo é fornecido pelo próprio do Wikipedia da linguagem: 1template <typename T> 2void qsort (T *result, T *list, int n) 3{ 4if (n == 0) return; 5T *smallerList, *largerList; 6smallerList = new T[n]; 7largerList = new T[n]; 8T pivot = list[0]; 9int numSmaller=0, numLarger=0; 10for (int i = 1; i < n; i++) 11{ 12if (list[i] < pivot) 13smallerList[numSmaller++] = list[i]; 14else 15largerList[numLarger++] = list[i]; 16} 17qsort(smallerList,smallerList,numSmaller); 18qsort(largerList,largerList,numLarger); 19 20int pos = 0; 21for ( int i = 0; i < numSmaller; i++) 22{ 23result[pos++] = smallerList[i]; 24} 25 26result[pos++] = pivot; 27 28for ( int i = 0; i < numLarger; i++) 29{ 30result[pos++] = largerList[i]; 31} 32 33delete [] smallerList; 34delete [] largerList; 35}; Listing 7: QuickSort em C Enquanto em Haskell, reduz para cinco linhas: 1qsort :: (Ord a) => [a] -> [a] 2qsort [] = [] 3qsort (x:xs) = qsort less ++ [x] ++ qsort more 4where less = filter (<x) xs 9 5more = filter (>=x) xs Listing 8: QuickSort em Haskell No quesito de benchmark, não é posśıvel concluir que uma é superior a outra, pois depende da aplicação.Haskell é melhor utilizada em programas de aprendizado de máquina, análise de dados e é escolhida pela facilidade na prototipação e de- puração dos algoritmos, enquanto em C, melhor aplicado para desenvolvimento de drivers, kernel (como GNU/Linux) e sistemas operacionais. Figura 6: Logo comum da linguagem C 6 Tutorial de instalação Uma instalação do Haskell completa consiste em 3 componentes, sendo eles: o com- pilador GHC, o gerenciador de pacotes Cabal e o construtor Stack, dispońıveis para sistemas baseados em GNU/Linux e BSDs, Windows e MacOS. A documentação destes se encontra no próprio site da linguagem. A forma recomendada da instalação do compilador seria através do GHCup, que se trata de um instalador geral da linguagem, bastante intuitivo e simples, independendo de usuário administrador e serve em todos os sistemas citados anteri- ormente (Windows seria com WSL2). Para obtê-lo, execute o comando a seguir em um terminal de sua preferência: 1curl --proto ’=https’ --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh A instalação também é posśıvel por meio dos gerenciadores de pacotes nati- vos de cada distribuição. A desvantagem deste processo seria a dependência alta de pacotes e o posśıvel atraso de versão em comparação com o desenvolvedor princi- pal. Entretanto, se necessário, a instalação pode ser feita em apenas um comando, sendo relativamente mais complicado para o Windows, que requer a configuração e instalação do Chocolatey. Diferentemente de outras linguagens, como Python ou Java, Haskell requer uma familiaridade básica com terminais. • FreeBSD 1pkg install ghc stack hs-cabal-install 2 10 • OpenSUSE 1sudo zypper install ghc stack 2 • Derivados RPM (RHEL, Fedora. . . ) 1sudo dnf in -y ghc stack 2 • Derivados APT (Debian, Ubuntu. . . ) 1sudo apt install -y ghc stack 2 • Gentoo 1sudo emerge -avq dev-lang/ghc dev-haskell/cabal-install 2 • Windows Como dito anteriormente, a instalação no Windows requer mais pas- sos que os demais, para a instalação do Chocolatey, execute o seguinte comando no Powershell: 1Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex 2((New-Object System.Net.WebClient).DownloadString 3(’https://community.chocolatey.org/install.ps1’)) 4 Concluindo a instalação do Chocolatey, pode-se dar sequência na instalação dos pacotes necessários: 1choco install ghc haskell-stack 2 Por fim, também é posśıvel utilizar o HUGS, sendo mais simplista e leve que GHC. Em ambientes GNU/Linux, apenas um pacote é necessário. Por exemplo, em sistemas que utilizam DNF como gerenciador de pacotes: 1sudo dnf in -y hugs98 7 Projetos relevantes 7.1 Shellcheck Shellcheck trata-se de uma ferramenta de código aberto que analisa shell scripts, capaz de apontar e esclarecer ao usuário problemas comuns de sintaxe e de semântica, muito comuns com iniciantes desta área. É compat́ıvel com os principais editores de código do mercado, como: Vim, Emacs, Visual Studio Code, Atom, Sublime, etc. 11 Figura 7: ShellCheck com o editor Emacs 7.2 Xmonad Xmonad é um gerenciador de janelas dinâmico, desenvolvido para sistemas Unix, focado em automatizar o processo de organização de janelas. Assim como seus semelhantes (i3, Dwm, SpecterWM), tem requisitos básicos de sistema e é uma alternativa para ambientes gráficos convenvionais como KDE, GNOME. Figura 8: Xmonad na prática 7.3 Tidal Cycles Tidal Cycles é um software de código de aberto, projetado para criar músicas por meio de padrões no código, sendo posśıvel gerar sequências ŕıtmicas complexas e ao vivo em poucas linhas de texto. Possui uma vasta biblioteca de funções e, a partir destas, pode-se gerar novas com infinitas combinações. Figura 9: Logo oficial do Tidal Cycles 12 7.4 Sigma Sigma é um mecanismo de regras desenvolvido pelo Facebook (Meta), onde são realizadas chamadas de poĺıticas. Cada interação com a rede social, desde uma curtida até uma atualização de status são avaliadas afim de detectar e bloquear interações maliciosas. De acordo com o blog oficial, Haskell foi escolhida devido a cinco fatores principais: 1. Fortemente tipada; 2. Correções a atualizações rapidamente em ambiente de produção; 3. Performance; 4. Suporte para desenvolvimento interativo; 5. Busca automática de massa de dados. 8 Conclusão O trabalho teve intenção de apresentar brevemente a linguagem Haskell. Por meio de várias pesquisas, pode-se concluir a relevância que a linguagem possui no ambiente acadêmico e como é defendida por muitos como o pilar da pureza funcional. Possui muitas vantagens e pontos fortes. Portanto, em comparação a linha- gem C, Java ou Python, a curva de aprendizado é superior, onde os programadores estão acostumados com a ordem: 1int soma (int x, int y); Verão que em Haskell é escrito de uma forma bem diferente: 1add :: Integer -> Integer -> Integer 2add x y = x + y Desta forma, considerando que a maioria dos jovens desenvolvedores iniciam a carreira com uma das linguagens supracitadas, o contato inicial com o paradigma funcional é desafiador, porém, tendo um esforço em aprender Haskell, terá grandes retornos, já que por ela, consegue realizar mais trabalho com menos código. Importante salientar o capricho da equipe desenvolvedora em oferecer um site bem constrúıdo, não apenas intuitivo, mas também no estilo consistente. Este cuidado torna mais acesśıvel e atraente tentar utilizar a linguagem, aspecto não visto nas demais. Além disto, os grandes projetos de Haskell enaltecem a linguagem em vários pontos, no site ou pelo nome. É de se imaginar que devido à menor popularidade em comparação a outras, anseiam por uma expansão da mesma. Infelizmente, a linguagem é pouco utilizada pela comunidade de desenvolve- dores, especialmente no Brasil, onde conteúdo sobre Haskell é mais visto em docu- mentos do meio universitário. Ademais, os projetos mais relevantes são ainda pouco populares no Github e outras plataformas de hospedagem de código, comprovando 13 Figura 10: haskell.org que desde seu ińıcio, Haskell não é muito requisitado no mercado e, consequente- mente, há poucas vagas e oportunidades que aplicam ou requisitam a linguagem. Porfim, tem-se uma linguagem muito poderosa, robusta e bem documen- tada que não tem o objetivo de crescer, mas sim, de manter confiável e persistir alinhada com o paradigma funcional. Portanto, devido ao aumento da demanda sobre computação automatizada e aprendizagem de máquina e a valorização dos dados digitais, leva a crer que Haskell terá um futuro promissor, considerando que análise de informações em abundância é um dos pontos fortes da linguagem. Referências [1] Bragilevsky, V. Haskell in Depth. Manning Publications, 2021. [2] Castillo, J. J., Guzmán, A., Ligorria, L. d. C., and Marciszack, M. M. Unidad n° 4: paradigma funcional. [3] Corvo, H. S. Programación funcional: caracteŕısticas, ejemplos, ventajas, des- ventajas. https://www.lifeder.com/programacion-funcional/, 2020. [On- line; accessed 7-September-2022]. [4] Costa, S. Prinćıpios e padrões de programação funcional — Parte 1. https://sergiocosta.medium.com/princ%C3%ADpios-e-padr%C3% B5es-de-programa%C3%A7%C3%A3o-funcional-parte-1-fa3bff0d6d2d, 2019. [Online; accessed 13-September-2022]. [5] Du Bois, A. R. Programação funcional com a linguagem haskell. Disponıvel em: http://www. inf. ufpr. br/andrey/ci062/ProgramacaoHaskell. pdf (2008). [6] Souza, V. E. S. Linguagens de programação 2016/2. [7] Thompson, S. Haskell: The Craft of Functional Programming. Addison-Wesley Professional, 2011. 14 https://www.lifeder.com/programacion-funcional/ https://sergiocosta.medium.com/princ%C3%ADpios-e-padr%C3%B5es-de-programa%C3%A7%C3%A3o-funcional-parte-1-fa3bff0d6d2d https://sergiocosta.medium.com/princ%C3%ADpios-e-padr%C3%B5es-de-programa%C3%A7%C3%A3o-funcional-parte-1-fa3bff0d6d2d [8] VedoVatto, T., and Costa, E. T. Haskell: uma linguagem de programação ideal para matemáticos. 15 Introdução História e Cronologia Paradigmas e suas características Características da linguagem Compiladores Haskell em comparação a outras linguagens Similares Miranda Nix Contrastantes C Tutorial de instalação Projetos relevantes Shellcheck Xmonad Tidal Cycles Sigma Conclusão
Compartilhar