A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Henrique Seabra, Rilter Tavares

Apresentações semelhantes


Apresentação em tema: "Henrique Seabra, Rilter Tavares"— Transcrição da apresentação:

1 Henrique Seabra, Rilter Tavares {hsd,rtn}@cin.ufpe.br

2 Roteiro A linguagem Configurando o ambiente Sintaxe Referências Origem
Características Aplicações Configurando o ambiente Sintaxe Referências

3 A Linguagem - Origem F# é uma linguagem de programação funcional tipada para o Framewok .NET Teve origem na família ML de linguagens ML é uma linguagem de programação funcional de proposta geral desenvolvida no final dos anos 1970 na Universidade de Edimburgo, e é considerada uma linguagem funcional impura, por permitir a programação imperativa, ao contrário de outras linguagens funcionais como Haskell. É visto como uma implementação de ML para .NET

4 A Linguagem - Características
F# foi projetado desde o início para dar uma boa interoperabilidade com outras linguagens .NET É uma linguagem de programação de script/ functional/ imperativa/ orientada a objeto Possui boa performance, código sucinto, suporta generics e pode ser compilado por outros compiladores, como o de Ocaml Não é limitada ao Windows

5 F#: Combinando Paradigmas
Functional Strong Typing Succinct Type Inference Data Types and Patterns 1st Class Functions Meta-Programming Objects .NET OO Model Interoperable .NET Visual Studio Libraries Tools Concurrency LINQ F# Compiler F# Interactive Visual Studio Integration Verificar referência e o porquê da citação de LINQ

6 A Linguagem - Aplicações
Aplicações de processamento pesado Sistemas de datamining Mercados Financeiros Análise estatística Jogos para XBOX usando XNA

7 Configurando o Ambiente
Baixar a última versão disponibilizada (F# CTP release) no link: Descompactar o arquivo Executar o arquivo InstallFSharp.msi

8 Hello World Criar arquivo “hello.fs”
No prompt de comando do Windows, executar a seguinte instrução: #light printfn "Hello World" Existem duas formas de executar os programas criados “c:Arquivos de programas\FSharp \bin\fsc.exe” hello.fs

9 F# em 2 minutos

10 Inferência de tipos let square x = x * x;;
let concat (x : string) y = x + y;; concat "Hello, " "World!";;

11 Funções de primeira ordem
Lambda expression >List.map (fun x -> x % 2 = 0) [ ];;

12 Printfn %d, %f, e %s são, respectivamente, inteiros, floats e strings
> printfn "%d * %f = %s" ((5.0 * 0.75).ToString());; 5 * = 3.75

13 Listas let vowels = ['e'; 'i'; 'o'; 'u'];; let cons = 'a' :: vowels;;
let sometimes = ['y'];;

14 Listas Iter Ex: Percorre cada item da coleção Idêntico ao foreach
Imprime todos os itens de uma lista List.iter (fun i -> printfn "Has element %d" i) [ ]

15 Listas Map Ex: Transforma uma coleção baseada numa função
Mapeia um array de inteiros para strings Array.map (fun (i : int) -> i.ToString()) [| |]

16 Listas Fold Ex: Transforma ou reduz a coleção em um único valor
Como ‘iter’ e ‘map’, também é aplicado a cada elemento Única que possui um parâmetro acumulativo Ex: Somatório de cada item da série (reduzir a série a um único valor Parâmetro acumulador é o somatório de todos os elementos Seq.fold (fun acc i -> i + acc) 0 { }

17 Sequences System.Collections.Generic.IEnumerator ou ‘Seq’
Podem especificar séries infinitas Apenas valor atual é guardado na memória Exemplo de seqüência de todos os inteiros: let allIntegers = Seq.init_infinite (fun i -> i)

18 Tuplas > let tupla = (1, false, "texto");;
val tuple : int * bool * string > let getNumberInfo (x : int) = (x, x.ToString(), x * x);; val getNumberInfo : int -> int * string * int > getNumberInfo 42;; val it : int * string * int = (42, "42", 1764) > let printBlogInfo (owner, title, url) = printfn "%s's blog [%s] is online at '%s'" owner title url;; val printBlogInfo : string * string * string -> unit > let myBlog = (“Pessoa", “Nome do blog", " val myBlog : string * string * string > printBlogInfo myBlog;; Pessoa's blog [Nome do blog] is online at ' val it : unit = ()

19 Records type Address = {Name:string; Address:string; Zip:int}
let whiteHouse = {Name="The White House"; Address="1600 Pennsylvania Avenue"; Zip=20500}

20 Option Values Dificuldade de achar o valor ‘null’
Valores sempre inicializados Necessidade de ausência de valores Similar aos valores nulos de C# ‘Option type’ representa dois estados: ‘Some’ e ‘None’ type Person = { First : string; MI : string option; Last : string } let billg = {First = "Bill"; MI = Some("H"); Last = "Gates" } let chrsmith = {First = "Chris"; MI = None; Last = "Smith" }

21 Function Currying > let addThree x y z = x + y + z;;
val addThree : int -> int -> int -> int > let addTwo x y = addThree 10 x y;; val addTwo : int -> int -> int > addTwo 1 1;; val it : int = 12

22 Discriminated Union type MicrosoftEmployee = | BillGates | SteveBalmer
| Worker of string | Lead of string * MicrosoftEmployee list let printGreeting (emp : MicrosoftEmployee) = match emp with | BillGates -> printfn "Hello, Bill" | SteveBalmer -> printfn "Hello, Steve" | Worker(name) | Lead(name, _) -> printfn "Hello, %s" name

23 Discriminated Union type MicrosoftEmployee = | BillGates | SteveBalmer
| Worker of string | Lead of string * MicrosoftEmployee list | ChrisSmith

24 Pattern Matching let listLength alist = match alist with | [] -> 0
| a :: b :: [] -> 2 | a :: b :: c :: [] -> 3 | _ -> failwith "List is too big!" let getType (x : obj) = match x with | :? string -> "x is a string" | :? int -> "x is an int" | :? Exception -> "x is an exception"

25 Operador Pipe let (|>) x f = f x 'a -> ('a -> 'b) -> 'b
let double x = x + x let toStr (x : int) = x.ToString() let rev (x : string) = new String(Array.rev (x.ToCharArray())) // 512 -> > "1024" -> "4201" let result = rev (toStr (double 512)) let result = 512 |> double |> toStr |> rev

26 Lazy Values Apenas computado quando necessário Ex:
> let x = lazy (printfn "Computed."; 42);; val x : Lazy<int> > let listOfX = [x; x; x];; val listOfX : Lazy<int> list > x.Force();; Computed. val it : int = 42

27 Lazy Values Pode ser usado para evitar computações desnecessárias ou “caras” Útil na construção de valores recursivos Ex: type InfiniteList = | ListNode of int * InfiniteList let rec circularList = ListNode(1, circularList) “circularList” referencia ele mesmo (loop infinito de ListNodes com valor 1) Sem “Lazy Initialization”, esse tipo de valor seria impossível Compilador faz esse trabalho nos “bastidores”

28 Mais alguns exemplos

29 Exercício 1 Construa uma função que recebe um Inteiro e retorna um Booleano que indica se o referido número é primo ou não. Ex: ehPrimo 3 = true ehPrimo 1 = false Faça uma função que, dado um Inteiro, retorna uma lista com todos os números primos menores ou iguais a ele. primosAte 5 = [2,3,5] ou [5,3,2]

30 Exercício 2 Faça uma função que retorne o elemento da folha mais à esquerda de uma árvore. Ex: leftmost arv Faça uma função que retorne, da esquerda para direita, todos os elementos de uma árvore. elementos arv -- Árvore data Arv a = No (Arv a) (Arv a) (Arv a) | Folha a deriving (Show, Eq) -- Exemplo de árvore: testeArv :: Arv Int testeArv = No (No (Folha 2) (Folha 3) (Folha 4)) (No (Folha 8) (No (Folha 9) (Folha 10) (Folha 11)) (Folha 20) ) (No (Folha 90) (Folha 100) (Folha 150)) -- 1) Faça uma função que retorne o elemento da folha mais à esquerda -- de uma árvore. -- Exemplo: -- leftmost testArv -- 2 leftmost :: Arv a -> a -- 2) Faça uma função que retorne, da esquerda para direita, todos os -- elementos de uma árvore. -- elementos testeArv [2,3,4,8,9,10,11,20,90,100,150] elementos :: Arv a -> [a]

31 Referências Microsoft Research. Disponível em: Último acesso em: 14/05/2008 SMITH, Chris. MSDN Blogs. Disponível em: Último acesso em: 14/05/2008 SEMPLE,Thomas Alexander. iMasters. Disponível em: Último acesso em: 14/05/2008 Wikipedia. Disponível em: Último acesso em: 14/05/2008 Microsoft Research. Disponível em: bd9-158e-4dc3-bc5b-8e3d5fd7b552 . Último acesso em: 14/05/2008 PICKERING, Robert. Foundations of F#. Apress: p.

32 Henrique Seabra, Rilter Tavares {hsd,rtn}@cin.ufpe.br


Carregar ppt "Henrique Seabra, Rilter Tavares"

Apresentações semelhantes


Anúncios Google