Maratona de Haskell - Quadragésimo Terceiro à Quadragésimo Quinto
Fala galera!
No último post nós vimos como importar módulos e agora vamos ver como criar nossos próprios módulos.
Como vimos no último pos criar um módulo para colocar funções e tipos que devem trabalhar juntos é uma boa prática.
Criar um módulo
Criar um novo módulo é super simples e somente temos que colocar essa linha de código no topo do arquivo.
module BST where
Essa é a sintaxe, nós usamos a palavra module
, o nome módulo que desejamos e a palavra where
.
Nesse exemplo nós criamos um módulo para a BST
que trabalhamos alguns posts atrás.
Usando o módulo
Para usar o módulo nesse caso é um pouco diferente porque temos que carregar o arquivo. Geralmente os módulos são instalados em Haskell
quando instalamos uma nova biblioteca então apenas importamos eles. No nosso caso estamos trabalhando com um módulo local então temos que carrega-lo primeiro.
Prelude> :l code/binary-tree.hs
code/binary-tree.hs:1:14: Warning:
-XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.
[1 of 1] Compiling BST ( code/binary-tree.hs, interpreted )
Ok, modules loaded: BST.
*BST> :m
Prelude> import BST
Prelude BST> BST.build [5,4,6,8,3,2,9]
Node 5 (Node 4 (Node 3 (Node 2 Empty Empty) Empty) Empty) (Node 6 Empty (Node 8 Empty (Node 9 Empty Empty)))
Prelude BST>
Primeiro carregamos o arquivo usando o comando :l
e o nome do arquivo. Nesse momento o módulo deste arquivo é carregado. Somente para confirmar podemos notar que a command line mudou o texto Prelude
para BST
.
Segundo passo é para remover o módulo com o comando :m
.
No último passo importamos nosso módulo como nós vimos no último post e podemos usar suas funções.
Selecionando as funções públicas
No exemplo acima todas as funções do módulo estão disponíveis. Nós podemos mudar isso e somente exportar as funções que queremos que sejam públicas. Se tentarmos usar a função build'
com a abordagem acima nós podemos.
Prelude BST> BST.build' [5,4,6,8,3,2,9] Empty
Node 5 (Node 4 (Node 3 (Node 2 Empty Empty) Empty) Empty) (Node 6 Empty (Node 8 Empty (Node 9 Empty Empty)))
Agora vamos dizer para nosso módulo quais funções devem ser públicas:
module BST
( build
, build2
, build3
, insert
, find
, findSub
, contains
, size
, height
, delete
) where
Com isso dizemos para o Haskell
quais são as funções que devem ser públicas.
Se importarmos e tentarmos usar a função build'
de novo nós receberemos um erro:
Prelude> :l code/binary-tree.hs
code/binary-tree.hs:1:14: Warning:
-XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.
[1 of 1] Compiling BST ( code/binary-tree.hs, interpreted )
Ok, modules loaded: BST.
*BST> :m
Prelude> import BST
Prelude BST> BST.build' [5,4,6,8,3,2,9] Empty
<interactive>:26:1:
Not in scope: ‘BST.build'’
Perhaps you meant one of these:
‘BST.build’ (imported from BST), ‘BST.build2’ (imported from BST),
‘BST.build3’ (imported from BST)
<interactive>:26:28: Not in scope: data constructor ‘Empty’
Prelude BST> BST.build [5,4,6,8,3,2,9]
Node 5 (Node 4 (Node 3 (Node 2 Empty Empty) Empty) Empty) (Node 6 Empty (Node 8 Empty (Node 9 Empty Empty)))
Mas a função build
esta disponível para nós porque dissemos que ela era pública.
A BST
com módulo esta em meu GitHub.
Agora já sabemos como criar e importar um módulo em Haskell
.