Leia outros artigos do autor
.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.