SlideShare ist ein Scribd-Unternehmen logo
1 von 227
F# para desenvolvedores C#
@lucasteles
@lucasteles42
Por que aprender uma
linguagem de programação
nova?
Uma linguagem que não afete a maneira
como você pensa em programar, não
vale a pena conhecer.
Alan Perlis
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
• Cross platform
– Funciona com VS Code (e outros)
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
Sobre
• Roda em cima do CLR
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
• É turing completa
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.
Índice
Diferenças entre C# e F#
Índice
Diferenças entre C# e F#
– Sintaxe
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Índice
Diferenças entre C# e F#
– Sintaxe
– Inferência de tipos
– Diferentes defaults
– Diferente filosofia
Exclusivo do F#
– Functional-first
– Algebraic type system
Sintaxe
Diferença de sintaxe:
Indentação ao invés de chaves
Diagrama da verdade
Diferença de sintaxe:
‘Backing fields’ criados automaticamente
de parâmetros no construtor
Diferença de sintaxe:
Juntar o construtor padrão com
definição da classe
Diferença de sintaxe:
Não precisamos de ‘return’
Diferença:
Campos são públicos por padrão
Diferença:
Inferência de tipos
Diferença:
Anotação de tipos
Diferença:
Keywords
Em C# usamos
class
E ‘var’
Em F# usamos
type
E ‘let’
Observação
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Observação
21 linhas de Código foram
reduzidas 5 linhas de código
Comparando com
C# futuro/moderno
Functional programming syntax
Functional programming syntax
Inferência de tipo
Defaults diferentes
F# tem ‘defaults’ diferentes do C#
F# tem ‘defaults’ diferentes do C#
• Imutável por padrão
• Mutabilidade é caso especial
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
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
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
Imutabilidade
Não null por default
Igualdade estrutural
Tudo tem que ser inicializado!
Diferente filosofia
Diferente filosofia
• C# historicamente é um derivado da linguagem C
Diferente filosofia
• C# historicamente é um derivado da linguagem C
• F# veio do ML, uma Meta Linguagem para
se provar coisas
Objetivo:
Objetivo:
• Você consegue entender o código usando apenas as
informações estão bem na sua frente?
Objetivo:
• Você consegue entender o código usando apenas informações
que você tem bem na sua frente?
• Você não tem permissão para olhar outras partes da base de
código!
C# é mais previsível que JavaScript!
C# é mais previsível que JavaScript!
Em C#, se você não corresponder os tipos corretamente você
obtém um erro de compilação!
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!
Como fazer uma linguagem mais previsível?
Como fazer uma linguagem mais previsível?
• As variáveis ​​não devem poder alterar seu tipo
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
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
Ninguém pode dizer!
Ninguém pode dizer!
Ninguém pode dizer!
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
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.
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
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
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
Functional First
• Funções
Princípios de uma linguagem funcional
• Funções
Princípios de uma linguagem funcional
• Composição (em todo lugar)
• Funções
Princípios de uma linguagem funcional
• Composição (em todo lugar)
• Parametrize tudo!
FP Principle:
Funções são coisas
Funções são coisas que
transformam inputs em outputs
Uma função existe por si só, não
precisa estar vinculada a uma classe
ou objeto
FP Principle:
Composição em todo lugar
>>
Composição em F#
Composição em F#
Composição em F#
Composição em C#
Composição em C#
Piping (F#)
Piping (F#)
Piping (F#)
Piping (F#)
Piping (F#)
Piping (C#)
Por que dizemos “functional-first”?
F# torna FP fácil
C# torna FP possível
- mas é estranho e não idiomático
FP Principle:
Parametrize tudo!
Tipos algébricos
Tipos algébricos
• Tipos não são classes
Tipos algébricos
• Tipos não são classes
• Estão mais para conjuntos
• O que são tipos?
• O que são tipos?
• O que são tipos?
• O que são tipos?
• O que são tipos?
• O que são tipos?
• O que são tipos?
Tipos em F# podem ser
compostos
Tipos em F# podem ser
compostos
Tipos novos podem ser criados a
partir de tipos menores usando:
Tipos novos podem ser criados a
partir de tipos menores usando:
“AND” types
“AND” types
“OR” types
“OR” types
Exemplo de “type
composition”
• Exemplo de alguns requisitos:
• Exemplo de alguns requisitos:
• Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
• 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
• 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
• 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
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# pensamos nos tipos como uma documentação
executável!
Por onde começar?
+
Visual Studio
2017
VS Code +
Ionade
Visitem https://fsharpforfunandprofit.com/

Weitere ähnliche Inhalte

Ähnlich wie F# para devs c#

Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Gilmar PSL
 
Curso PHP UNIFACS 2014.1 – 1a Aula
Curso PHP UNIFACS 2014.1 – 1a AulaCurso PHP UNIFACS 2014.1 – 1a Aula
Curso PHP UNIFACS 2014.1 – 1a AulaJonata Weber
 
Workshop ExtJS4
Workshop ExtJS4Workshop ExtJS4
Workshop ExtJS4javamanrj
 
#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 mainstreamsJacqueline Abreu
 
Introdução a Banco de Dados UFMG/2014-02 - Aula 06
Introdução a Banco de Dados UFMG/2014-02 - Aula 06Introdução a Banco de Dados UFMG/2014-02 - Aula 06
Introdução a Banco de Dados UFMG/2014-02 - Aula 06Junior Grossi
 
Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Helder da Rocha
 
Escreva Código para Pessoas Além de Máquinas
Escreva Código para Pessoas Além de MáquinasEscreva Código para Pessoas Além de Máquinas
Escreva Código para Pessoas Além de MáquinasThalita Pinheiro
 
Escreva código para pessoas além de máquinas
Escreva código para pessoas além de máquinasEscreva código para pessoas além de máquinas
Escreva código para pessoas além de máquinasEdlaine Zamora
 
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinas
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinasTDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinas
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinastdc-globalcode
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisAna Paula Gomes
 
JavaScript "for dummies"
JavaScript "for dummies"JavaScript "for dummies"
JavaScript "for dummies"Murilo Beltrame
 
Clean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoClean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoPaulo Henrique da Silva
 
Php, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFPhp, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFClaudson Oliveira
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
 
Elixir - o que existe atrás do mistério
Elixir - o que existe atrás do mistérioElixir - o que existe atrás do mistério
Elixir - o que existe atrás do mistérioAlex Ferreira
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheirasHigor César
 
Microfundamento - Algoritmos e Lógica de Programação (1).pdf
Microfundamento - Algoritmos e Lógica de Programação (1).pdfMicrofundamento - Algoritmos e Lógica de Programação (1).pdf
Microfundamento - Algoritmos e Lógica de Programação (1).pdfFelipeSoares580387
 

Ähnlich wie F# para devs c# (20)

Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
 
Curso PHP UNIFACS 2014.1 – 1a Aula
Curso PHP UNIFACS 2014.1 – 1a AulaCurso PHP UNIFACS 2014.1 – 1a Aula
Curso PHP UNIFACS 2014.1 – 1a Aula
 
Workshop ExtJS4
Workshop ExtJS4Workshop ExtJS4
Workshop ExtJS4
 
#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
 
Introdução a Banco de Dados UFMG/2014-02 - Aula 06
Introdução a Banco de Dados UFMG/2014-02 - Aula 06Introdução a Banco de Dados UFMG/2014-02 - Aula 06
Introdução a Banco de Dados UFMG/2014-02 - Aula 06
 
Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014
 
Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001
 
Escreva Código para Pessoas Além de Máquinas
Escreva Código para Pessoas Além de MáquinasEscreva Código para Pessoas Além de Máquinas
Escreva Código para Pessoas Além de Máquinas
 
Escreva código para pessoas além de máquinas
Escreva código para pessoas além de máquinasEscreva código para pessoas além de máquinas
Escreva código para pessoas além de máquinas
 
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinas
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinasTDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinas
TDC2018FLN | Trilha Java - Escrevendo código para pessoas além de máquinas
 
In tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e maisIn tests we trust: começando com TDD, mocks e mais
In tests we trust: começando com TDD, mocks e mais
 
JavaScript "for dummies"
JavaScript "for dummies"JavaScript "for dummies"
JavaScript "for dummies"
 
Clean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimentoClean Code - Boas práticas para desenvolvimento
Clean Code - Boas práticas para desenvolvimento
 
Php, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFPhp, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJF
 
Clean code
Clean codeClean code
Clean code
 
TWP40 Revisão Geral 3
TWP40 Revisão Geral 3TWP40 Revisão Geral 3
TWP40 Revisão Geral 3
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Elixir - o que existe atrás do mistério
Elixir - o que existe atrás do mistérioElixir - o que existe atrás do mistério
Elixir - o que existe atrás do mistério
 
Aprensentacao oo-trincheiras
Aprensentacao oo-trincheirasAprensentacao oo-trincheiras
Aprensentacao oo-trincheiras
 
Microfundamento - Algoritmos e Lógica de Programação (1).pdf
Microfundamento - Algoritmos e Lógica de Programação (1).pdfMicrofundamento - Algoritmos e Lógica de Programação (1).pdf
Microfundamento - Algoritmos e Lógica de Programação (1).pdf
 

Mehr von Lucas Teles

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 feijaoLucas Teles
 
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​Lucas Teles
 
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ãoLucas Teles
 
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...Lucas Teles
 
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 caminhoLucas Teles
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticosLucas Teles
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxLucas Teles
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooksLucas Teles
 
Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elmLucas Teles
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functionsLucas Teles
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedoresLucas Teles
 
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 softwareLucas Teles
 
Elmish com xamarin.forms
Elmish com xamarin.formsElmish com xamarin.forms
Elmish com xamarin.formsLucas Teles
 

Mehr von Lucas Teles (15)

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​
 
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
 
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#