Carregar apresentação
A apresentação está carregando. Por favor, espere
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.