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

F# para devs c# tdc