Elemar DEV

Tecnologia e desenvolvimento .net

Haskell para programadores C# – parte 9 – Modules

Olá pessoal. Tudo certo?!

Voltemos a série sobre desenvolvimento com Haskell para programadores C#. Se está chegando agora, recomendo ver um dos posts anteriores:

  1. Primeiros passos
  2. Aplicação e escrita de funções
  3. Tipos! Tipos! Tipos! .. e classes
  4. Respostas condicionais
  5. List Comprehensions
  6. Recursão
  7. High-order functions
  8. Composition

Nesse post, falo sobre como “organizar” o código em aplicações Haskell usando módulos.

Os exemplos que utilizo foram inspirados no livro Learn You a Haskell for Great Good!: A Beginner’s Guide.

Módulos em Haskell

Para aprender, comecemos com um exemplo simples. Veja:

module Geometry
	(
	cubeVolume,
	cubeArea,
	cuboidVolume,
	cuboidArea
	)
	where
		cubeVolume :: Float -> Float
		cubeVolume side = cuboidVolume side side side
		
		cubeArea :: Float -> Float
		cubeArea side = cuboidArea side side side

		cuboidVolume :: Float -> Float -> Float -> Float
		cuboidVolume a b c = rectArea a b * c

		cuboidArea :: Float -> Float -> Float -> Float
		cuboidArea a b c = rectArea a b * 2 + rectArea a c * 2 + rectArea c b * 2

		rectArea :: Float -> Float -> Float
		rectArea a b = a * b
	

O que há para destacar:

  1. Usamos a palavra-chave module para identificar o novo módulo;
  2. Relacionamos, entre parênteses, o nome das funções que desejamos “exportar”. Ou seja, que vão estar visíveis para quem for consumir o módulo
  3. Funções não exportadas, rectArea em nosso exemplo, não são visíveis fora do módulo.

.. são como classes estáticas em C#

C# não possui suporte nativo para módulos. Eis minha implementação com classes estáticas:

public static class Geometry
{
    public static float CubeVolume(float side)
    {
        return CuboidVolume(side, side, side);
    }

    public static float CubeArea(float side)
    {
        return CuboidArea(side, side, side);
    }

    public static float CuboidVolume(float a, float b, float c)
    {
        return RectArea(a, b)*c;
    }

    public static float CuboidArea(float a, float b, float c)
    {
        return RectArea(a, b)*2 + RectArea(a, c)*2 + RectArea(c, b)*2;
    }

    private static float RectArea(float a, float b)
    {
        return a*b;
    }
}

Pegou a idéia?

Usando com WinHugs

Abaixo, uso o módulo no WinHugs.

image

Era isso.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

Você está comentando usando sua conta WordPress.com. Sair / Mudar )

Imagem do Twitter

Você está comentando usando sua conta Twitter. Sair / Mudar )

Foto do Facebook

Você está comentando usando sua conta Facebook. Sair / Mudar )

Conectando a %s

Informação

Publicado às 30/06/2012 por em Post e marcado , , .

Estatísticas

  • 431,381 hits
%d bloggers like this: