.NET

20 mai, 2009

Introdução ao .Net F# – Parte 02

Publicidade

Leia outros artigos do autor

Introdução ao F# – Parte 01

.Net Microframework – o futuro chegou!

*

Desde o primeiro artigo que postei sobre F#, em janeiro de 2008, venho recebendo diversos emails com dúvidas e solicitação de mais informações sobre a linguagem. Resolvi, então, criar uma série de tutoriais, começando inicialmente com os fundamentos da linguagem, passando então para “o mundo real”, ou seja, como o F# poderá ajudar nos projetos do dia a dia.

O conhecimento sobre programação é algo que deve ser adquirido a cada dia, a busca pelo conhecimento deve ser constante, isto com certeza diferenciará um bom profissional daquele excepcional. Conhecer novas linguagens ajuda a ampliar os horizontes, e encontrar novas maneiras para resolução de problemas. Mesmo que a linguagem não seja utilizada no dia a dia, um novo foco certamente ampliará sua visão e o tornará um profissional mais completo. 

No artigo anterior, vimos como instalar o F# no Visual Studio e o comando, “let”, que define “tornar obrigatório” o valor a um símbolo, sendo talvez o comando mais utilizado. Neste artigo vamos conhecer o comando Match.

Entendendo o comando Match

O Comando match é utilizado para comparação de padrão. Pode-se imaginar ele como um switch (ou select case em VB) MUITO mais potente. Pode-se também imaginá-lo como uma sequencia de if/then/else. O reconhecimento de padrões (match) permite que você identifique um padrão através de inúmeros tipos e valores.

A Listagem 01 ilustra um exemplo de utilização do comando Match. Neste caso, a entrada de um número resulta em uma string, por exemplo, se entrarmos com o valor 2, a saída da função será “Diretor”.

A Sintaxe para o match é a palavrachave, seguida pelo identificador que será comparado, e depois com “with”. No exemplo 01, a leitura ficará como: “torne” nivelUsuario, recebendo o parâmetro de entrada “nivel”. Compare “nivel” com o padrão: 1, caso a comparação seja positiva, retorne “Administrador”, caso negativo compare com o padrão 2. Se o padrão 2 for positivo, retorne “Diretor”. Caso negativo compare o próximo padrão. Esta lógica se repete até o padrão 05. A Linha 10 do exemplo trata os demais casos. Se o padrão não foi encontrado, retorne “Não definido”.

Note que cada padrão é separado por uma barra vertical. Nos casos mais simples, o padrão é representado com um número ou um identificador, assim como na listagem 01. Nada impede porém do padrão ser representado por uma função. Após o padrão deve ser adicionada uma flecha (->), seguida pela expressão de retorno. O underline, na linha 10, é utilizado para definir outros casos, similar ao “else” do select case (ou switch).

Listagem 01: Exemplo de match

     #light
     let nivelUsuario nivel =
         match nivel with
         | 1    -> "Administrador"
         | 2    -> "Diretor"
         | 3    -> "Gerente"
         | 4    -> "Analista"
         | 5    -> "SAC"
         | _    -> "Não Definido" 

Exemplo prático

A Listagem 02 ilustra um exemplo de match utilizando expressões, ainda que bem simples, podemos começar a entender um pouco do poder deste comando. Quando a entrada do método for menor que zero, o retorno será “gelado”, quando for maior que 100, o retorno será “Quente”, e para outros casos, o retorno será “Morno”.

A Figura 01 mostra o teste feito em tempo real no método, e seu retorno. Este poder do F#, permite que cada trecho de código seja testado em tempo de desenvolvimento, minimizando assim a chance de erro do sistema, ganhando confiabilidade e diminuindo retrabalhos.

Lembrando a parte 01… Para testar, selecione o trecho do código e mande-o para o F# Interactive, com “Alt + Enter” . Na janela de interação,  digite o nome do método, seguido do parâmetro de entrada, seguido de “;;”, conforme Figura 01. Se tudo deu certo, o valor será exibido ao lado.

Listagem 02: Exemplo de um método que retorna a temperatura

     #light
    
     let temperatura x =
         match x with
         | x when x < 0    -> "Gelado"
         | x when x > 100  -> "Quente"
         | _               -> "Morno"

Figura 01: Testando o método de temperatura.

Recursividade

Recursividade pode, em linhas gerais, ser definida quando um método chama ele mesmo. Em projetos é comum o uso de recursividade não apenas em algoritmos númericos, mas também em construções de menus hierárquicos, níveis de permissão de usuário, criação de estruturas entre outras.

Em C#, ou VB.Net, para criar recursividade, basta chamar o método dentro de sua estrutura. No F# é quase a mesma coisa, mas por uma questão de “segurança” e boa prática, é preciso utilizar o “rec” antes da função, caso contrário o compilador levantará um erro. Na Listagem 03, vemos uma estrutura recursiva com F#. na linha 3 é definido um método “quadrado”, que apenas multiplica X por ele mesmo. Na linha 05 é definido um método chamado de soma de quadrados. Este método “varre” cada valor de números, chama a função “quadrado” e soma com o resultado da iteração anterior.

“C”, representa o começo dos números, e “f” o fim. Com esta estrutura, automaticamente são varridos os valores de “numeros”, até chegar em “F”, fim. O Fim é determinado pela linha 7, quando o não há mais nenhum valor em números, retornando então Zero.

Listagem 03: Utilizando Match com recursividade

     #light
    
     let quadrado x = x * x
    
     let rec somaDeQuadrados numeros =
         match numeros with
         | []    -> 0.0
         | c::f  -> quadrado c + somaDeQuadrados f 

Finalizando

Nesta segunda etapa da série de F# aprendemos um pouco sobre Match. Nas próximas vezes veremos mais alguns comandos, até termos base suficiente para criarmos um “exemplo real”. Forte abraço e até o próximo artigo.