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

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

Henrique Seabra, Rilter Tavares F#

Apresentações semelhantes


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

1 Henrique Seabra, Rilter Tavares F#

2 Roteiro A linguagem 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 TypingSuccinctType Inference Data Types and Patterns 1 st Class FunctionsMeta-Programming Objects.NET OO ModelInteroperable.NET Visual StudioLibrariesToolsConcurrencyLINQ Tools F# CompilerF# Interactive Visual Studio Integration

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: c:Arquivos de programas\FSharp \bin\fsc.exe hello.fs #light printfn "Hello World"

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) [1.. 10];;

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

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

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

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

16 Listas Fold 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", "http://blog.com");; val myBlog : string * string * string > printBlogInfo myBlog;; Pessoa's blog [Nome do blog] is online at 'http://blog.com 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 :: [] -> 1 | 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 let (|>) x f = f x 'a -> ('a -> 'b) -> 'b Operador Pipe 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 > let listOfX = [x; x; x];; val listOfX : Lazy 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: 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 type InfiniteList = | ListNode of int * InfiniteList let rec circularList = ListNode(1, circularList)

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. Ex: 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. Ex: elementos arv

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: 2841bd9-158e-4dc3-bc5b-8e3d5fd7b552. Último acesso em: 14/05/ bd9-158e-4dc3-bc5b-8e3d5fd7b552 PICKERING, Robert. Foundations of F#. Apress: p.

32 Henrique Seabra, Rilter Tavares F#


Carregar ppt "Henrique Seabra, Rilter Tavares F#"

Apresentações semelhantes


Anúncios Google