2. É linguagem multi-paradigma(OO, imperativa) -> functional-first;
Solucionar problemas complexos com códigos simples / elegantes;
Encoraja a imutabilidade do código;
É compativel com bibliotecas .NET
Por que F#?
5. Functions != Classes, objects, methods.
Functions são cidadões de primeira classe.
Functions
bike->moto
Tunel da transformação
6. 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
8. Types != Classes
São imutaveis
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
A não ser que use o operador mutable
9. 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
10. 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
11. 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
12. 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