Bootstraping - Preparando o Ambiente


Playlists

1 Preparando o ambiente

A preparação do ambiente do Haskell incluindo compilador (GHC), o language server (Haskell Language Server - HLS), o Haskell Tool Stack e algumas ferramentas ancilares (Cabal, …) pode ser feita utilizando uma única ferramenta chamada GHCup.

O GHCUp funciona tanto no Linux quanto no macOS, FreeBSD ou no Windows através do WSL2 (https://youtu.be/U7gdzYiFJKg).

1.1 Instalando

Vá até a página do GHCup https://www.haskell.org/ghcup/ e copie a linha de instalação e cole no seu terminal:

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

Você deve ver uma saída parecida com a abaixo:

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

Welcome to Haskell!

This script can download and install the following binaries:
  * ghcup - The Haskell toolchain installer
  * ghc   - The Glasgow Haskell Compiler
  * cabal - The Cabal build tool for managing Haskell software
  * stack - A cross-platform program for developing Haskell projects (similar to cabal)
  * hls   - (optional) A language server for developers to integrate with their editor/IDE

ghcup installs only into the following directory,
which can be removed anytime:
  /home/dummy/.ghcup

Press ENTER to proceed or ctrl-c to abort.
Note that this script can be re-run at any given time.

Aceitando-se continuar (ENTER), o instalador vai então perguntar se você quer instalar cada uma das ferramentas e sobre algumas configurações. Abaixo cada uma delas e suas opções:


-------------------------------------------------------------------------------

Detected bash shell on your system...
Do you want ghcup to automatically add the required PATH variable to "/home/dummy/.bashrc"?

[P] Yes, prepend  [A] Yes, append  [N] No  [?] Help (default is "P").

Você muito provavelmente quer permitir que o GHCup faça as alterações no seu script de inicialização do seu shell. Na dúvida permita ou escolhendo P o simplesmente presionando ENTER (opção default).


-------------------------------------------------------------------------------
Do you want to install haskell-language-server (HLS)?
HLS is a language-server that provides IDE-like functionality
and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ...
Also see https://haskell-language-server.readthedocs.io/en/stable/

[Y] Yes  [N] No  [?] Help (default is "N").

O GHCup não escolhe a instalação do Haskell Language server por padrão. Se você não sabe o que está fazendo escolha Y, para que o HLS seja instalado. Note que o default é não instalar o HLS.

Alguns editores de texto como VSCode são capazes de baixar o HLS automaticamente, mas não tem nenhum problema você permitir que o GHCup já faça isso agora.


-------------------------------------------------------------------------------
Do you want to enable better integration of stack with GHCup?
This means that stack won't install its own GHC versions, but uses GHCup's.
For more information see:
  https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation-experimental
If you want to keep stacks vanilla behavior, answer 'No'.

[Y] Yes  [N] No  [?] Help (default is "Y").

Sim! Você quer. Responda Y ou apenas pressione ENTER (opção default).


System requirements
  Please ensure the following distro packages are installed before continuing (you can exit ghcup and return at any time): build-essential curl libffi-dev libffi8 libgmp-dev libgmp10 libncurses-dev pkg-config
Press ENTER to proceed or ctrl-c to abort.
Installation may take a while.

Em seguida o GHCup avisa que alguns pacotes da sua distribuição precisam ser instalados manualmente. o GHCup não os instala, você precisa fazer isso por conta própria!

Abra outra janela do seu terminal e instale os pacotes sugeridos, conforme abaixo (exemplo compatível com distros Debian/Ubuntu/Mint. Adapte o comando para a sua distribuição):

$ sudo apt install build-essential curl libffi-dev libffi8 libgmp-dev libgmp10 libncurses-dev pkg-config

Neste ponto o GHCup vai começar a fazer a sua mágica. Isso pode levar um tempinho a depender da sua conexão com a internet e do desempenho da sua própria máquina.


Com a instalação concluida, reinicie o terminal para carregar as novas configurações, ou simplesmente execute o comando . ~/.ghcup/env para carregá-las. As ferramentas stack, cabal, ghc, ghci, … já devem estar no PATH e prontas para o uso. Siga o exemplo de um projeto simples na seção seguinte para testar o seu ambiente.

Também veja informações complementares aqui: https://www.haskell.org/get-started/

2 Testando o ambiente com um primeiro projeto compilável

  • Para criar projetos, utilizaremos a ferramenta stack. Essa ferramenta cria um ambiente isolado
  • A primeira compilação do seu projeto pode levar um longo tempo, pois o stack vai efetuar a instalação de um novo compilador (caso necessário).
$ stack new primeiro-projeto simple
$ cd primeiro-projeto
$ stack setup
$ stack build
$ stack exec primeiro-projeto

Os dois últimos comandos são referentes a compilação do projeto e execução.

2.1 Stack

O stack cria a seguinte estrutura de diretório:

  • LICENSE: informação sobre a licença de uso do software.
  • README.md: informações sobre o projeto em formato Markdown.
  • Setup.hs: retrocompatibilidade com o sistema cabal.
  • primeiro-projeto.cabal: informações das dependências do projeto. Atualizado automaticamente pelo stack.

2.2 Stack

  • stack.yaml: parâmetros do projeto
  • package.yaml: configurações de compilação e dependências de bibliotecas externas.
  • src/Main.hs: arquivo principal do projeto.

2.3 Main.hs

module Main where   -- indica que é o módulo principal

main :: IO ()
main = do                  -- início da função principal
  putStrLn "hello world"   -- imprime hello world

2.4 Flags de compilador

  • Para indicar as flags de compilação que você quer usar no projeto, edite o arquivo nomeprojeto.cabal e na seção executable acrescente a linha:
ghc-options:  flags

2.5 Flags de compilador

  • Um conjunto de flags bastante comum é para ligar as opções RTS, habilitar todos os avisos, permitir multithread e habilitar otimização:
ghc-options:  -rtsopts -Wall -threaded -O2

Outras opções estão disponíveis no site GHC Flags.

2.6 Projetos com múltiplos códigos-fonte

Caso seu projeto seja organizado com múltiplos arquivos, será preciso seguir algumas regras:

  • O nome do módulo tem que ser o mesmo da composição do diretório e nome do arquivo.
  • Deve incluir o nome do módulo no arquivo .cabal incluindo a opção other-modules: Modulo.

2.7 Projetos com múltiplos códigos-fonte

Se sua estrutura de diretório está da seguinte forma:

src/Main.hs
src/Modulo.hs
src/Util/Modulo2.hs

Os nomes dos módulos deverão ser Main, Modulo e Util.Modulo2, respectivamente. O arquivo .cabal deve conter other-modues: Modulo, Util.Modulo2.

2.8 Bibliotecas externas

Para incluir bibliotecas externas em seu projeto, acrescente a linha build-depends: biblioteca no seu arquivo .cabal:

build-depends: base, random, mtl

Os módulos disponíveis podem ser encontrados no Hackage e no Stackage.

2.9 Bibliotecas Externas

Para determinar a versão da biblioteca basta escrever a restrição logo após o nome: base >= 4.7 && < 5.

2.10 Versão do compilador

Se você quiser especificar a versão do compilador, edite o arquivo stack.yaml e altere o valor do campos resolver seguindo a numeração em Stackage.

2.11 Buscando funções

No site Hoogle você pode buscar por funções existentes em qualquer biblioteca publicada no Hackage tanto pelo nome, como pela assinatura.

Experimentem buscar por (a -> b) -> [a] -> [b].

3 Editores

Em ordem alfabética (e em ordem do melhor para o pior 🤣)

3.1 Emacs

A melhor escolha!

3.2 Vim

If you must…

3.3 VSCode

Para utilizar o Haskell com o VSCode, basta instalar o plugin do HLS https://marketplace.visualstudio.com/items?itemName=haskell.haskell

Este plugin cuida automaticamente da configuração do seu editor e da instalação de um ambiente incluindo o compilador e o HLS.

4 Disclaimer

Estes slides foram preparados para os cursos de Paradigmas de Programação e Desenvolvimento Orientado a Tipos na UFABC.

Este material pode ser usado livremente desde que sejam mantidos, além deste aviso, os créditos aos autores e instituições.