O que é uma linguagem funcional?

Uma linguagem funcional é composta puramente por funções e dados imutáveis.

Comparada com a Orientação à Objetos, linguagens funcionais tendem a ser muito mais abstratas e genéricas, como a estrutura de dados é mais simples e imutável, evita-se o risco de efeitos inesperados.

O principal ponto na escolha de uma linguagem funcional, é que lidam melhor com paralelismo e grande volume de cálculo, diferente de aplicações modernas que utilizam orientação à objetos, as quais envolvem concorrência, múltiplas threads e/ou multiprocessadores, a mudança de estado de forma paralela para orientação a objetos pode tornar-se problemática.

Existem muitos lugares aos quais uma linguagem funcional pode se enquadrar, para cálculos puramente matemáticos parece ser o mais indicado.

Diversas ferramentas e empresas que utilizam linguagem funcional, o C#, por exemplo, incorpora conceitos funcionais para dar suporte ao LINQ. Algumas empresas têm o back-end construído com Scala: Twitter, Foursquare, Kickoff, Coursera…

Entretanto em softwares corporativos e aplicações que não exigem recursos de processador o paradigma de orientação a objetos é o mais indicado.

Não existe “Silver Bullet” na escolha do paradigma, como o Martin Fowler diz “Qualquer tolo pode escrever código que o computador pode entender, bons programadores escrevem código que humanos podem entender”.

Principais Features do F#

F# é uma linguagem concisa. Geralmente a resolução de um mesmo problema (quando aplicável) em F# comparado ao C# se dá em um menor número de linhas de código.

Uma das grandes Features do F# é o “Type Inference”, onde não precisamos dizer ao compilador qual é o Data Type em questão, pois a tipagem é baseada no valor atribuído.

Em F# é muito fácil criar funções poderosas que recebem outras funções como parâmetro, ou combinar funções para gerar uma nova funcionalidade.

F# lida muito bem com concorrência, basicamente por que os dados são imutáveis por default, ou seja, os problemas com locks são muito mais fáceis de serem evitados, além de possuir muitas ferramentas e bibliotecas para ajudar a trabalhar com paralelismo.

Os problemas com Null Reference simplesmente não existem em F#.

Imutabilidade é um grande fator para tornar um programa assertivo e a prova de falhas. Em C# também é possível criar tipos imutáveis, mas temos muito mais código conforme comparativo abaixo (não se preocupe se não entender a Syntax).
F# Code:

Criando um tipo em F#

Criando um tipo em F#

C# Code:

Criação de Tipo em C#

 

Performance F# vs C#

Muito se fala sobre a performance do F# e do C#. Existem diversas dúvidas quanto qual a melhor solução, e para isto digo que depende do problema, para um cálculo complexo tranquilamente optaria pelo lado funcional do F#, por ser mais simples de escrever.

Em muitos casos é possível alcançar a mesma eficiência ou muito próximo do F# utilizando o C#, porém indiscutivelmente com um código muito maior e mais verboso.

O mais importante é saber que quase tudo que é feito em C# pode ser feito com F#. Existem particularidades de cada linguagem que somente fazendo o “Disassembly” da função escrita em ambas linguagens e reescreve-la (otimizando) pode lhe mostrar qual é a melhor para aquela situação.

Comparativo de um cálculo para somar os lados de um quadrado escrito em ambas linguagens:

C#

Algorítimo feito em C#

Algorítimo feito em C#

F#

Algoritimo em F#

Algorítimo em F#

Resultado:

F# TotalMilliseconds = 6.6892

C# TotalMilliseconds = 9.5484

 

Maiores informações: http://fsharpforfunandprofit.com/posts/fvsc-sum-of-squares

 

talk-is-cheap

 

 

Enfim a hora mais esperada, se você chegou até aqui, bravo guerreiro, você é digno de continuar sua caminhada. (Se deu um pulo até aqui também =] )

Vamos começar criando um aplicativo Console.

Abra o Visual Studio e crie um novo projeto Console Application na linguagem F#

solution

Ao abrir a aplicação temos o seguinte códigomain

Vamos entender alguns pontos por aqui: o EntryPoint como você já deve suspeitar indica o ponto de entrada da nossa aplicação, a função main deve ser a última em nosso arquivo, do contrário você receberá um erro de compilação.

Agora observe a keyword let , ela serve para fazer o data binding de um valor (função) para um nome, como no exemplo abaixo:

Keyword let

Keyword let

Como você suspeita, é perfeitamente possível usar as bibliotecas do .NET Framework.

Conforme vimos anteriormente, por default os objetos em F# não são mutáveis, é possível “alterar” um valor de duas formas:

Shadowed ou com a keyword mutable

Shadowed:

shadowed

shadowed

Imprime Peter Parker no Console.

Mutable:

mutable

mutable

Imprime Peter Parker no Console.

Funções

Agora que aprendemos atribuir valores, vamos criar nossa primeira função que exibe se uma pessoa tem idade menor, igual ou maior que 18 anos para fazer um cadastro em nosso sistema.

Primeiro vamos criar um tipo chamado Pessoa

Criaremos o tipo com duas propriedades somente Get, o que irá garantir imutabilidade do nosso objeto.

funcoes

No método main vamos instanciar o nosso objeto e fazer a validação proposta inicialmente de checar a maioridade de determinada pessoa.

Saída: Maior que 18 anos :)

Saída: Maior que 18 anos 🙂

Conclusão

Compreendemos o que é uma linguagem funcional, conhecemos algumas empresas que utilizam atualmente em seu back-end. Vimos também as principais features do F# e uma comparação de verbosidade menor em relação ao C# para o mesmo objetivo.

Aprendemos a criar variáveis e funções, modificar um fluxo de um programa e principalmente os conceitos envolvidos dentro do F#.

Referencias

http://stackshare.io

http://www.tryfsharp.org/Learn/getting-started

http://fsharpforfunandprofit.com/posts/fvsc-sum-of-squares

https://msdn.microsoft.com/pt-br/library/dd233231.aspx

 

Aprendemos a criar variáveis e funções, modificar um fluxo de um programa e principalmente os conceitos envolvidos dentro do F#.

Felipe Augusto

Desenvolvedor desde 2011, acredita em pessoas auto gerenciáveis, times com cultura de auto desempenho e também gosta de uma boa cerveja com os amigos.
Curte jogar Sonic, Tomb Raider e Pokemon.
Trabalha mais especificamente com .NET, gosta de iniciativas Open Source e colaborativas, sempre que pode contribui com a comunidade com artigos, desde simples tutoriais para problem solving até artigos sobre tecnologias do mercado ou fora dele.

Facebook LinkedIn 

Comentários

comentarios