Maratona de Haskell - Quadragésimo Primeiro à Quadragésimo Segundo Dia

Fala galera!

Nós terminamos nossos exercícios com a Binary Search Tree no último post e agora vamos voltar a seguir o livro que estavamos seguindo.
Hoje vamos iniciar a falar sobre módulo em Haskell.


O que são módulos?

Bem, módulos são arquivos onde podemos defininir functions, types e type classes.
Um módulo tem um monte de definições e podemos exportar apenas algumas delas. Essa é a mesma ideia que temos de público e privado em orientação a objeto.

Separar o código em módulos é um bom sinal e nos da alguma vantagens. A primeira deve ser reusabilidade, se temos funções e tipos que podem ser chamados por outros módulos é uma boa ideia coloca-los por similariedade no mesmo módulo para deixar simples o seu reuso. Outo benefício seria a manutenabilidade porque se funções e tipos relacionados estão no mesmo módulo é mais fácil cuidar deles.


Importando um módulo

Vamos dizer que queremos usar uma determinada função de um determinado módulo como nub do módulo Data.List. A função nub remove valores duplicados da lista. Para usa-la temos que importar o módulo.
Vamos ver como se importa o módulo:

import Data.List

Com esta linha nós estamos importando todas as funções e tipos que o módulo Data.List exporta.
Agora nós podemos usar a função nub.

Data.List> nub [1,1,2,3,1,4,2,5,2,3,4,6]
[1,2,3,4,5,6]

E tudo funciona bem. Se não importamos o módulo recebemos um erro:

> nub [1,1,2,3,1,4,2,5,2,3,4,6]
<interactive>:2:1: Not in scope: nub


Importar somente algumas funções

Quando usamos import como acima nós estamos importando todas as funções do módulo. Para importar somente as funções que necessitamos nós temos que dizer para o Haskell quais são as funções que queremos como isso:

import Data.List (nub, sort)

Agora apenas importamos as funções nub e sort e todas as outras funções do módulo Data.List não estão disponiveis para uso.


Eliminando algumas funções

Do mesma forma que podemos escolher as funções que queremos importar é possível fazer o oposto e escolher as que não queremos. Fazer isso é muito simples:

import Data.List hiding (nub)

> nub [1,1,2,3,1,4,2,5,2,3,4,6]
<interactive>:2:1: Not in scope: nub

E agora temos todas as funções do módulo Data.List menos a função nub.


Dando um alias para o módulo

As vezes dois módulos possuem o mesmo nome de função ou o nosso projeto tem o mesmo nome de função que o módulo que estamos importando tem. Neste caso Haskell nos da a oportunidade de criar um alias para o módulo importado e assim continuar usando suas funções.

> import qualified Data.List as L

L> L.nub [1,1,2,3,1,4,2,5,2,3,4,6]
[1,2,3,4,5,6]

Agora nós podemos usar a letra L para acessar as funções do módulo.


Hoje vimos como importar módulos em Haskell.
Próximos posts nós continuaremos vendo como módulos funcionam em Haskell.

Written on January 14, 2017