2. ● É linguagem multi-paradigma (OO, imperativa) -> functional-first
● Soluciona problemas complexos com códigos simples / elegantes
● Encoraja a imutabilidade do código
● É compativel com bibliotecas .NET
● É multiplataforma
Por que F#?
4. ● Functions != Classes, objects, methods.
● Functions são cidadãos de primeira classe.
Functions
bike->moto
Tunel da transformação
5. Functions -> inputs e outputs
let add x = (fun y -> x + y) Int->(int->int)
Output function
int->intint
let useFn f = f() + 1 Int->(int->int)
Input function
int->int int
Int->int
parameter functionint->int
int int
let tranfInt f x= (f x) + 1
7. ● Types != Classes
● São imutáveis
● Não possuem valor “null”
Types
let inteiro = 1 //val inteiro : int
type Cliente = {Codigo : int;
RazaoSocial : string}
let cliente = {Codigo = 1;
RazaoSocial = "Gambiarra Ltda"} //val cliente : Cliente
let func x = x+1
let func1 = func //val func1 : (int -> int)
Record type
Exceto usando operador mutable
8. Types Compositions
Conjunto de pessoas Conjunto de datas
João, 12 Janeiro
Maria, 15 Dezembro
José, 17 Junho
Product Type
type pessoa = {Nome:string; Sobrenome:string}
type data = {Dia:int; Mes:int; Ano:int}
type aniversario = pessoa * data
let pessoa1 = { Nome = "João"; Sobrenome="Silva"}
let dia11Janeiro = {Dia = 11; Mes=1; Ano=1989}
let aniversario = (pessoa1, dia11Janeiro)
Tuple type
9. Types Compositions
Dinheiro
Cartão de crédito
Cheque
type pagamento =
| Dinheiro of double
| Cheque of double
| CartaoCredito of string * string * double
let tipoCheque = CartaoCredito("EVANDRO F SOUZA",
"454545454",
100.00)
Sum Type
10. ● Similar ao swith do C#
Match Expressions
let tipoCliente x=
match x with
| 1 -> "Cliente normal"
| 2 -> "Cliente vip"
| _ -> "Não definido"
public string TipoCliente(int x)
{
switch (x)
{
case 1: return "Cliente
normal";
case 2: return "Cliente vip";
default: return "Não definido";
}
}
Não é opcional
11. Operador Pipe forward
● Maneira elegante funcional de passar parâmetros para uma função
let square x = x * x
let toStr x = x.ToString()
let rev (x : string) = new string (Array.rev (x.ToCharArray()))
let result = rev (toStr (square 9))
9 81 “81” “18"
let result = 9 |> square |> toStr |> rev
14. Somar a raiz quadrada de 1 até N.
Necessidade
3 1, 2, 3 1, 4, 9 14
15. public static class SumOfSquaresHelper
{
public static int Square(int i)
{
return i * i;
}
public static int SumOfSquares(int n)
{
var sum = 0;
for (var i = 1; i <= n; i++)
{
sum += Square(i);
}
return sum;
}
}
let square x = x * x
let sumOfSquares n =
[1..n] |> List.map square |> List.sum
sumOfSquares 3
✓ Menos código (16 linhas -> 4 linhas)
✓ Sem declaração de tipos
✓ Desenvolvimento interativo
16. public static class SumOfSquaresHelper
{
public static int SumOfSquares(int n)
{
return Enumerable.Range(1, n)
.Select(i => i * i)
.Sum();
}
}
let square x = x * x
let sumOfSquares n =
[1..n] |> List.map square |> List.sum
sumOfSquares 3