SlideShare uma empresa Scribd logo
1 de 223
Globalcode – Open4education
Lucas Teles
Developer at Lambda3
F# para desenvolvedores C#
@lucasteles42@lucasteles
Globalcode – Open4education
Por que aprender uma
linguagem de programação
nova?
Globalcode – Open4education
Uma linguagem que não afete a maneira
como você pensa em programar, não
vale a pena conhecer.
Alan Perlis
Globalcode – Open4education
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
Globalcode – Open4education
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
Globalcode – Open4education
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
• Cross platform
– Funciona com VS Code (e outros)
Globalcode – Open4education
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
• Cross platform
– Funciona com VS Code (e outros)
• Comunidade ativa
– fsharp.org
– F# Slack channel
Globalcode – Open4education
Sobre
• Roda em cima do CLR
Globalcode – Open4education
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
Globalcode – Open4education
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
• É turing completa
Globalcode – Open4education
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
• É turing completa
• É possível usufruir de qualquer bibliotecas escritas em/para
C# tal como EntityFramework, ASP.NET, Xamarin, etc.
Globalcode – Open4education
Índice
Diferenças entre C# e F#
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Globalcode – Open4education
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Globalcode – Open4education
Sintaxe
Globalcode – Open4education
Globalcode – Open4education
Diferença de sintaxe:
Indentação ao invés de chaves
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença de sintaxe:
‘Backing fields’ criados automaticamente
de parâmetros no construtor
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença de sintaxe:
Juntar o construtor padrão com
definição da classe
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença de sintaxe:
Não precisamos de ‘return’
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença:
Campos são públicos por padrão
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença:
Inferência de tipos
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença:
Anotação de tipos
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferença:
Keywords
Globalcode – Open4education
Em C# usamos
class
E ‘var’
Globalcode – Open4education
Em F# usamos
type
E ‘let’
Globalcode – Open4education
Observação
Globalcode – Open4education
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Globalcode – Open4education
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Globalcode – Open4education
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Globalcode – Open4education
Comparando com
C# futuro/moderno
Globalcode – Open4education
Globalcode – Open4education
Functional programming syntax
Globalcode – Open4education
Functional programming syntax
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Inferência de tipo
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
F# tem ‘defaults’ diferentes do
C#
Globalcode – Open4education
F# tem ‘defaults’ diferentes do C#
• Imutável por padrão
• Mutabilidade é caso especial
Globalcode – Open4education
F# tem ‘defaults’ diferentes do C#
• Imutável por padrão
• Mutabilidade é caso especial
• Classes e tipos por padrão não nuláveis
• Permitir nulo é um caso especial
Globalcode – Open4education
F# tem ‘defaults’ diferentes do C#
• Imutável por padrão
• Mutabilidade é caso especial
• Classes e tipos por padrão não nuláveis
• Permitir nulo é um caso especial
• Igualdade estrutural por padrão
• Igualdade por referencia é caso especial
Globalcode – Open4education
F# tem ‘defaults’ diferentes do C#
• Imutável por padrão
• Mutabilidade é caso especial
• Classes e tipos por padrão não nuláveis
• Permitir nulo é um caso especial
• Igualdade estrutural por padrão
• Igualdade por referencia é caso especial
• Todos os valores devem ser sempre totalmente
inicializados
Globalcode – Open4education
Imutabilidade
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Não null por default
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Igualdade estrutural
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Tudo tem que ser inicializado!
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Diferente filosofia
Globalcode – Open4education
Diferente filosofia
• C# historicamente é um derivado da linguagem C
Globalcode – Open4education
Diferente filosofia
• C# historicamente é um derivado da linguagem C
• F# veio do ML, uma Meta Linguagem para
se provar coisas
Globalcode – Open4education
Objetivo:
Globalcode – Open4education
Objetivo:
Você consegue entender o código usando
apenas informações que você tem bem na sua
frente
Globalcode – Open4education
Objetivo:
Você consegue entender o código usando
apenas informações que você tem bem na sua
frente?
Sem olhar outras partes da base de código!
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
C# é mais previsível que JavaScript!
Globalcode – Open4education
C# é mais previsível que JavaScript!
Em C#, se você não corresponder os tipos
corretamente você obtém um erro de
compilação!
Globalcode – Open4education
C# é mais previsível que JavaScript!
Em C#, se você não corresponder os tipos
corretamente você obtém um erro de
compilação!
Isso é ótimo!
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar tipos diferentes deve dar erro de compilação
Globalcode – Open4education
Globalcode – Open4education
Ninguém pode dizer!
Globalcode – Open4education
Ninguém pode dizer!
Globalcode – Open4education
Ninguém pode dizer!
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar tipos diferentes deve dar erro de compilação
• Objetos sempre devem ser inicializados em um estado válido,
caso contrario erro de compilação
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar objetos de diferentes deve dar erro de compilação
• Objetos sempre devem ser inicializados em um estado válido,
caso contrario erro de compilação
• Uma vez criados, objetos e coleções devem ser imutáveis.
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar tipos diferentes deve dar erro de compilação
• Objetos sempre devem ser inicializados em um estado válido,
caso contrario erro de compilação
• Uma vez criados, objetos e coleções devem ser imutáveis.
• Dados ou erros ausentes devem ser explicitados. Sem
permitir nulos
Globalcode – Open4education
F# tenta ser uma linguagem previsível
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar tipos diferentes deve dar erro de compilação
• Objetos sempre devem ser inicializados em um estado válido,
caso contrario erro de compilação
• Uma vez criados, objetos e coleções (geralmente) são
imutáveis.
• Dados ou erros ausentes (geralmente) são explícitos. Sem
permitir nulos
Globalcode – Open4education
F# tenta ser uma linguagem previsível
• As variáveis ​​não devem poder alterar seu tipo
• Objetos com os mesmos valores devem ser iguais por padrão
• Comparar tipos diferentes deve dar erro de compilação
• Objetos sempre devem ser inicializados em um estado válido,
caso contrario erro de compilação
• Uma vez criados, objetos e coleções (geralmente) são
imutáveis.
• Dados ou erros ausentes (geralmente) são explícitos. Sem
permitir nulos
Globalcode – Open4education
Functional First
Globalcode – Open4education
Funções
Princípios de uma linguagem funcional
Globalcode – Open4education
Funções
Composição
Princípios de uma linguagem funcional
Globalcode – Open4education
Princípios de uma linguagem funcional
Funções
Composição
Parametrização
Globalcode – Open4education
FP Principle:
Funções são coisas
Globalcode – Open4education
Funções são coisas que
transformam inputs em outputs
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Uma função existe por si só, não
precisa estar vinculada a uma classe
ou objeto
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
FP Principle:
Composição em todo lugar
Globalcode – Open4education
Globalcode – Open4education
>>
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Composição em F#
Globalcode – Open4education
Composição em F#
Globalcode – Open4education
Composição em F#
Globalcode – Open4education
Composição em C#
Globalcode – Open4education
Composição em C#
Globalcode – Open4education
Piping (F#)
Globalcode – Open4education
Piping (F#)
Globalcode – Open4education
Piping (F#)
Globalcode – Open4education
Piping (F#)
Globalcode – Open4education
Piping (F#)
Globalcode – Open4education
Piping (C#)
Globalcode – Open4education
Por que dizemos
“functional-first”?
F# torna FP fácil
C# torna FP possível
- mas é estranho e não idiomático
Globalcode – Open4education
FP Principle:
Parametrize tudo!
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Tipos algébricos
Globalcode – Open4education
Tipos algébricos
• Tipos não são classes
Globalcode – Open4education
Tipos algébricos
• Tipos não são classes
• Estão mais para conjuntos
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
• O que são tipos?
Globalcode – Open4education
Tipos em F# podem
ser compostos
Globalcode – Open4education
Tipos em F# podem
ser compostos
Globalcode – Open4education
Tipos novos podem ser criados a
partir de tipos menores usando:
Globalcode – Open4education
Tipos novos podem ser criados a
partir de tipos menores usando:
Globalcode – Open4education
“AND” types
Globalcode – Open4education
“AND” types
Globalcode – Open4education
“OR” types
Globalcode – Open4education
“OR” types
Globalcode – Open4education
Exemplo de “type
composition”
Globalcode – Open4education
Exemplo de alguns requisitos:
Globalcode – Open4education
Exemplo de alguns requisitos:
Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
Globalcode – Open4education
Exemplo de alguns requisitos:
Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
Para dinheiro, não precisamos de nenhuma
informação extra
Globalcode – Open4education
Exemplo de alguns requisitos:
Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
Para dinheiro, não precisamos de nenhuma
informação extra
Para cheques, precisamos do número do cheque
Globalcode – Open4education
Exemplo de alguns requisitos:
Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
Para dinheiro, não precisamos de nenhuma
informação extra
Para cheques, precisamos do número do cheque
Para cartões, precisamos do tipo de cartão e do
número do cartão
Globalcode – Open4education
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# iriamos compor os tipos da seguinte forma
Globalcode – Open4education
Em F# pensamos nos tipos como uma documentação
executável!
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Por onde começar?
+
Visual Studio
2017
VS Code +
Ionade
Globalcode – Open4education
Visitem https://fsharpforfunandprofit.com/
Globalcode – Open4education
Obrigado!
@lucasteles42@lucasteles

Mais conteúdo relacionado

Semelhante a F# para devs c# tdc

Semelhante a F# para devs c# tdc (20)

Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
 
Python tdc2019
Python tdc2019 Python tdc2019
Python tdc2019
 
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPCombatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
 
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em PythonTDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
TDC2016SP - Desenvolvendo uma linguagem maker inclusiva em Python
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
Abordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NETAbordagem Funcional para Gerenciamento de Erros em .NET
Abordagem Funcional para Gerenciamento de Erros em .NET
 
Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
 Lições aprendidas com a Re (escrita |design) de uma aplicação PHP  Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
Lições aprendidas com a Re (escrita |design) de uma aplicação PHP
 
TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#
 
Programação Funcional usando C#
Programação Funcional usando C#Programação Funcional usando C#
Programação Funcional usando C#
 
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
 
PHP e Robótica com Arduino - TDC 2012
PHP e Robótica com Arduino - TDC 2012PHP e Robótica com Arduino - TDC 2012
PHP e Robótica com Arduino - TDC 2012
 
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
TDC2018SP | Trilha Kotlin - Kodando com Kotlin aplicacoes front-end.
 
TDC2016POA | Trilha PHP - Por que utilizar o Laravel?
TDC2016POA | Trilha PHP - Por que utilizar o Laravel?TDC2016POA | Trilha PHP - Por que utilizar o Laravel?
TDC2016POA | Trilha PHP - Por que utilizar o Laravel?
 
Gerando aplicações Spring Boot e AngularJS com gerador de código JHipster
Gerando aplicações Spring Boot e AngularJS com gerador de código JHipsterGerando aplicações Spring Boot e AngularJS com gerador de código JHipster
Gerando aplicações Spring Boot e AngularJS com gerador de código JHipster
 
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
 
Computação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma JavaComputação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma Java
 
Php Experience 2016 - Mercado de Trabalho para Elefantes
Php Experience 2016 - Mercado de Trabalho para ElefantesPhp Experience 2016 - Mercado de Trabalho para Elefantes
Php Experience 2016 - Mercado de Trabalho para Elefantes
 
JSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesJSF 2 - Java "Super" Faces
JSF 2 - Java "Super" Faces
 
Desafios e glórias na implementação de infra as code
Desafios e glórias na implementação de infra as codeDesafios e glórias na implementação de infra as code
Desafios e glórias na implementação de infra as code
 

Mais de Lucas Teles

Mais de Lucas Teles (17)

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijao
 
Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​
 
Fabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com ElmishFabulous - Xamarin.Forms com Elmish
Fabulous - Xamarin.Forms com Elmish
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijão
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminho
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticos
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptx
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooks
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elm
 
C# 8 e além
C# 8 e alémC# 8 e além
C# 8 e além
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functions
 
F# para devs c#
F# para devs c#F# para devs c#
F# para devs c#
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedores
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo software
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.forms
 
Net - Threads
Net - ThreadsNet - Threads
Net - Threads
 

F# para devs c# tdc