10 June, 2012 3 Comments AUTHOR: elemarjr CATEGORIES: Sem categoria Tags: , ,

Haskell para programadores C# – parte 2 – Aplicação e escrita de funções

Tempo de leitura: 1 minute

Olá pessoal. Tudo certo!?

Então você leu o primeiro post dessa série?! Em caso negativo, leia antes de continuar. Em caso positivo, saiba que continuaremos a desvendar programação em Haskell sob a perspectiva de um cara que sabe programar em C#.

Se você está considerando aprender Haskell “de verdade”, recomendo o excelente livro Programming in Haskell que, aliás, estarei usando como referência para essa série.

Aplicação de funções

Antes de qualquer coisa, em Haskell, quando falamos em “aplicar um função”, estamos dizendo o memso que “chamar/executar uma função” para um determinado conjunto de argumentos.

Haskell tem sintaxe extremamente econômica. Sendo assim, dispensa parênteses sempre que possível.

Um argumento

Por exemplo, em C#, você chamaria um método da mesma classe, passando um argumento, assim:

Foo(x);

em Haskell:

foo x

Dois (ou mais) argumentos

Dois argumentos, em C#:

Foo(a, b);

Em Haskell

foo a b

Em Haskell, além de não usar parênteses, você também não usa vírgulas para separar argumentos.

O resultado de uma função como argumento

C#

Foo(Fee(x));
Foo(a, Fee(b));

Haskell

foo (fee x)
foo a (fee b)

Repare, em Haskell os parênteses servem para determinar prioridade de execução.

Pegou a idéia?!

Escrevendo funções

Haskell tem um conjunto rico de funções built-in. Entretanto, você pode definir suas próprias funções facilmente.

Para começar, crie um arquivo com um nome qualquer (usarei hello.hs). Perceba que hs (Haskell Script) é a extensão comum usada para arquivos que definem funções em Haskell.

Esse será o conteúdo:

add a b = a + b
inc a = add a 1
double x = x + x
quadruple x = double (double x)

Familiar, não?! Parecem expressões lambda em C#. Certo!? Veja:

Func<int, int, int> add = (a, b) => a + b;
Func<int, int> inc = a => add(a, 1);
Func<int, int> @double = x => x + x;
Func<int, int> quadruple = x => @double(@double(x));

De onde você acha que o time do C# tirou a idéia?! Smiley de boca aberta

No hugs, utilize a opção do menu (File->Open) para carregar o script. Então, poderá usar suas novas funções normalmente.

image

Perceba que o Hugs executa a instrução :load do Haskell para efetivamente fazer o trabalho.

Era isso.