Maratona de Haskell - Primeiro Dia

Hoje foi o primeiro dia da minha maratona de Haskell e eu gostaria de compartilhar com vocês meus aprendizados e entendimentos.


Configuração

Vamos iniciar com como configurar seu computador para usar Haskell. Você tem que instalar o Haskell compilador que é chamado GHC. Os passo de instalação estão nesse link. Minha dica é não instalar o compilador do Haskell em sua máquina, e sim usar uma imagem Docker com Haskell para isso. Se você não tem Docker instalado em seu computador você pode ver como instala-lo aqui. Depois de instalar o Docker você somente necessita inicia-lo e rodar o comando: docker run -ti –rm -v $(pwd):/code haskell:7.10 bash. Agora você tem uma máquina virtual rodando o compilador do Haskell para você. Para iniciar o interpretador do GHC você tem que executar o comando: ghci.


Imutabilidade

Haskell, como uma linguagem de funcional pura, trabalha com imutabilidade. Isso significa que você não tem variaveis e quando um valor é setado para uma container de dados é impossível muda-lo. Haskell não possue side effects e isso nos da mais segurança que sempre que chamamos uma função com um valor o resultado será o mesmo. Essa característica aumenta a testabilidade do Haskell e nós não temos que procurar onde a variavél foi modificada e porque esta afetando os funcionamento de uma função.


Lazy

Haskell é lazy. Isso significa que Haskell somente faz a computação que é necessária e espera até o último momento para executar as funções e retornar os resultados. Por exemplo, vamos dizer que temos uma lista com 1000 números que queremos converter em uma lista de módulos e obter o primeiro valor, para fazer isso Haskell irá processar a lista de módulo até encontrar o primeiro valor e irá parar.

let xs = [1..999999]
xs
map (\x -> x `mod` 2) xs
head (map (\x -> x `mod` 2) xs)

Com esse exemplo você pode ver como Haskell é poderoso usando a sua demora de processamento. Quando nós rodamos as linhas 2 e 3 nós temos que esperar alguns segundos para obter o resultado, por outro lado quando executamos a linha 4 o resultado é retornado automáticamente. Isoo acontece porque Haskell para de processar assim que descobre o resultado.


Tipo estático

Haskell é estaticamente tipado, mas diferentemente de linguagens como Java or C# nós não temos que assinar tipos para tudo. Haskell infere os tipos para valores e funções e usa o compilador para avaliar os erros. Por isso Haskell não é considerada uma linguagem verbosa.


Aritmética

Os cálculos e processamentos aritméticos em Haskell são similares as outras linguagens de programação. Os precedentes universais da matématica são seguidos e respeitados.


Boolean

Booleanos em Haskell são similares as outras linguagens também. Temos os valores True e False e os operadores && (e), || (ou) and not (negação). Para testar dois valores nós temos os operadores == (igual) e /= (diferente). Teste eles no GHCI.


Funções

Tudo em Haskell são funções ou quase tudo. Nós podemos não ter percebido mas + e - são funções. Esses tipos de funções são chamadas infix porque elas são chamadas entre os operandos como 5 + 6. A maioria das funções são chamadas prefix, que são funções chamadas antes dos operandos como succ 9. Funções prefix podem ser chamadas como funções infix, para fazermos isso temos que coloca-las entre crases (`) como em 9 `div` 3. O oposto também é possível, neste caso nós temos que colocar a função entre parênteses (()).
Para criamos uma função nós temos que da-la um nome e parâmetros. Quando criamos uma função no GHCI é necessário usar let, mas se criamos uma função em um arquivo que será compilado não devemos usar o let. Vamos criar algumas funções?

Let mult2 x = x * 2
mult2 3
6
mult2 4
8
let add x y = x + y
add 2 3
5
add 3 3
6


Esses foram os meus primeiros passos com Haskell.

Written on December 1, 2016