SlideShare uma empresa Scribd logo
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

PDF
Introdução à Linguagem de Programação GO
PPT
TDC2017 | São Paulo - Trilha Acessibilidade How we figured out we had a SRE t...
PDF
Projeto CoCoA: Um Colete de Comunicação Alternativa
PDF
Linguagens de programação
PDF
Programação Orientada a Objetos de Arduino com Eclipse
PPTX
A primeira linguagem que todo programador deve aprender
PPT
Programação Funcional usando F#
PPTX
Mergulhando no ecossistema .NET
Introdução à Linguagem de Programação GO
TDC2017 | São Paulo - Trilha Acessibilidade How we figured out we had a SRE t...
Projeto CoCoA: Um Colete de Comunicação Alternativa
Linguagens de programação
Programação Orientada a Objetos de Arduino com Eclipse
A primeira linguagem que todo programador deve aprender
Programação Funcional usando F#
Mergulhando no ecossistema .NET

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

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

Mais de Lucas Teles (17)

PPTX
Type script alem do arroz com feijao
PPTX
Conheça ROP - Programação orientada e trilhos​
PPTX
Fabulous - Xamarin.Forms com Elmish
PPTX
TypeScript - Além do arroz com feijão
PPTX
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
PPTX
Algoritmos genéticos aplicados em problemas de busca de caminho
PPTX
Algoritmos geneticos
PPTX
Aplicações serverless com Blazor.pptx
PPTX
Simplificando componentes com react hooks
PPTX
Um melhor frontend com elm
PPTX
C# 8 e além
PPTX
Introducao a azure functions
PPTX
F# para devs c#
PPTX
Block chain para desenvolvedores
PPTX
Generalização prematura e complexidade acidental, a raiz do mal de todo software
PPTX
Elmish com xamarin.forms
PPTX
Net - Threads
Type script alem do arroz com feijao
Conheça ROP - Programação orientada e trilhos​
Fabulous - Xamarin.Forms com Elmish
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 em problemas de busca de caminho
Algoritmos geneticos
Aplicações serverless com Blazor.pptx
Simplificando componentes com react hooks
Um melhor frontend com elm
C# 8 e além
Introducao a azure functions
F# para devs c#
Block chain para desenvolvedores
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Elmish com xamarin.forms
Net - Threads
Anúncio

Último (7)

PDF
Evolução em código: algoritmos genéticos com PHP
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PDF
Dos requisitos ao código: como criar código rastreável em PHP
PPTX
Mapeamento de Objeto para Tabela Relacional
PDF
apresentacao introducao computacao ead.pdf
PPTX
Curso de Windows 11 resumido na prática.pptx
Evolução em código: algoritmos genéticos com PHP
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Dos requisitos ao código: como criar código rastreável em PHP
Mapeamento de Objeto para Tabela Relacional
apresentacao introducao computacao ead.pdf
Curso de Windows 11 resumido na prática.pptx

F# para devs c# tdc