Click here to load reader

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

  • Upload
    rhys

  • View
    24

  • Download
    0

Embed Size (px)

DESCRIPTION

F#. Henrique Seabra, Rilter Tavares {hsd,rtn}@cin.ufpe.br. Roteiro. A linguagem Origem Características Aplicações Configurando o ambiente Sintaxe Referências. A Linguagem - Origem. F# é uma linguagem de programação funcional tipada para o Framewok .NET - PowerPoint PPT Presentation

Citation preview

F#

Henrique Seabra, Rilter Tavares{hsd,rtn}@cin.ufpe.brF#RoteiroA linguagemOrigemCaractersticasAplicaesConfigurando o ambienteSintaxeRefernciasA Linguagem - OrigemF# uma linguagem de programao funcional tipada para o Framewok .NETTeve origem na famlia ML de linguagensML uma linguagem de programao funcional de proposta geral desenvolvida no final dos anos 1970 na Universidade de Edimburgo, e considerada uma linguagem funcional impura, por permitir a programao imperativa, ao contrrio de outras linguagens funcionais como Haskell. visto como uma implementao de ML para .NET3A Linguagem - CaractersticasF# foi projetado desde o incio para dar uma boa interoperabilidade com outras linguagens .NET uma linguagem de programao de script/ functional/ imperativa/ orientada a objetoPossui boa performance, cdigo sucinto, suporta generics e pode ser compilado por outros compiladores, como o de OcamlNo limitada ao Windows4F#: Combinando ParadigmasVerificar referncia e o porqu da citao de LINQ5A Linguagem - AplicaesAplicaes de processamento pesadoSistemas de dataminingMercados FinanceirosAnlise estatsticaJogos para XBOX usando XNAConfigurando o AmbienteBaixar a ltima verso disponibilizada (F# CTP release) no link: http://research.microsoft.com/fsharp/release.aspxDescompactar o arquivoExecutar o arquivo InstallFSharp.msiHello WorldCriar arquivo hello.fs

No prompt de comando do Windows, executar a seguinte instruo:c:Arquivos de programas\FSharp-1.9.6.2\bin\fsc.exe hello.fs#lightprintfn "Hello World"Existem duas formas de executar os programas criados8F# em 2 minutosInferncia de tiposlet square x = x * x;;let concat (x : string) y = x + y;;concat "Hello, " "World!";;Funes de primeira ordemLambda expression>List.map (fun x -> x % 2 = 0) [1 .. 10];;Printfn> printfn "%d * %f = %s" 5 0.75 ((5.0 * 0.75).ToString());;5 * 0.750000 = 3.75%d, %f, e %s so, respectivamente, inteiros, floats e stringsListaslet vowels = ['e'; 'i'; 'o'; 'u'];;let cons = 'a' :: vowels;;let sometimes = vowels @ ['y'];;ListasIterPercorre cada item da coleoIdntico ao foreachEx:Imprime todos os itens de uma listaList.iter (fun i -> printfn "Has element %d" i) [1 .. 10]ListasMapTransforma uma coleo baseada numa funoEx:Mapeia um array de inteiros para stringsArray.map (fun (i : int) -> i.ToString()) [| 1 .. 10 |]ListasFoldTransforma ou reduz a coleo em um nico valor Como iter e map, tambm aplicado a cada elementonica que possui um parmetro acumulativoEx:Somatrio de cada item da srie (reduzir a srie a um nico valorParmetro acumulador o somatrio de todos os elementosSeq.fold (fun acc i -> i + acc) 0 { 1 .. 10 }SequencesSystem.Collections.Generic.IEnumerator ou SeqPodem especificar sries infinitasApenas valor atual guardado na memriaExemplo de seqncia de todos os inteiros:let allIntegers = Seq.init_infinite (fun i -> i) 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 = () Recordstype Address = {Name:string; Address:string; Zip:int} let whiteHouse = {Name="The White House"; Address="1600 Pennsylvania Avenue"; Zip=20500}Option ValuesDificuldade de achar o valor nullValores sempre inicializadosNecessidade de ausncia de valoresSimilar aos valores nulos de C#Option type representa dois estados: Some e Nonetype 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" }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 = 12Discriminated Union type MicrosoftEmployee = | BillGates | SteveBalmer | Worker of string | Lead of string * MicrosoftEmployee listlet printGreeting (emp : MicrosoftEmployee) = match emp with | BillGates -> printfn "Hello, Bill" | SteveBalmer -> printfn "Hello, Steve" | Worker(name) | Lead(name, _) -> printfn "Hello, %s" nameDiscriminated Union type MicrosoftEmployee = | BillGates | SteveBalmer | Worker of string | Lead of string * MicrosoftEmployee list | ChrisSmith

Pattern Matchinglet 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"let (|>) x f = f x'a -> ('a -> 'b) -> 'bOperador Pipelet double x = x + x let toStr (x : int) = x.ToString() let rev (x : string) = new String(Array.rev (x.ToCharArray()))

// 512 -> 1024 -> "1024" -> "4201" let result = rev (toStr (double 512))let result = 512 |> double |> toStr |> revLazy ValuesApenas computado quando necessrioEx:> let x = lazy (printfn "Computed."; 42);;val x : Lazy

> let listOfX = [x; x; x];;val listOfX : Lazy list

> x.Force();;Computed.val it : int = 42Lazy ValuesPode ser usado para evitar computaes desnecessrias ou carastil na construo de valores recursivosEx:

circularList referencia ele mesmo (loop infinito de ListNodes com valor 1)Sem Lazy Initialization, esse tipo de valor seria impossvelCompilador faz esse trabalho nos bastidorestype InfiniteList = | ListNode of int * InfiniteListlet rec circularList = ListNode(1, circularList)Mais alguns exemplosExerccio 1Construa uma funo que recebe um Inteiro e retorna um Booleano que indica se o referido nmero primo ou no.Ex: ehPrimo 3 = true ehPrimo 1 = false

Faa uma funo que, dado um Inteiro, retorna uma lista com todos os nmeros primos menores ou iguais a ele. Ex:primosAte 5 = [2,3,5] ou [5,3,2] Exerccio 2Faa uma funo que retorne o elemento da folha mais esquerda de uma rvore.Ex:leftmost arv

Faa uma funo que retorne, da esquerda para direita, todos os elementos de uma rvore.Ex:elementos arv--rvoredata Arv a = No (Arv a) (Arv a) (Arv a) | Folha a deriving (Show, Eq)

--Exemplo de rvore:testeArv :: Arv InttesteArv = 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) Faa uma funo que retorne o elemento da folha mais esquerda--de uma rvore.

--Exemplo:--leftmost testArv--2

leftmost :: Arv a -> a

--2) Faa uma funo que retorne, da esquerda para direita, todos os--elementos de uma rvore.

--Exemplo:--elementos testeArv-- [2,3,4,8,9,10,11,20,90,100,150]

elementos :: Arv a -> [a]

30RefernciasMicrosoft Research. Disponvel em: http://research.microsoft.com/fsharp/manual/lexyacc.aspx. ltimo acesso em: 14/05/2008SMITH, Chris. MSDN Blogs. Disponvel em: http://blogs.msdn.com/chrsmith/archive/2008/05/02/f-in-20-minutes-part-i.aspx. ltimo acesso em: 14/05/2008SEMPLE,Thomas Alexander. iMasters. Disponvel em: http://imasters.uol.com.br/artigo/7750/dotnet/conheca_o_f. ltimo acesso em: 14/05/2008Wikipedia. Disponvel em: http://pt.wikipedia.org/wiki/ML_(linguagem_de_programa%C3%A7%C3%A3o). ltimo acesso em: 14/05/2008Microsoft Research. Disponvel em: http://www.microsoft.com/france/vision/mstechdays08/WebcastMSDN.aspx?EID=12841bd9-158e-4dc3-bc5b-8e3d5fd7b552 . ltimo acesso em: 14/05/2008 PICKERING, Robert. Foundations of F#. Apress: 2007. 360 p.

Henrique Seabra, Rilter Tavares{hsd,rtn}@cin.ufpe.brF#