Henrique Seabra, Rilter Tavares

Slides:



Advertisements
Apresentações semelhantes
Python: Dicionários Claudio Esperança.
Advertisements

Universidade do Vale do Paraíba Colégio Técnico Antônio Teixeira Fernandes Disciplina Ferramenta de Desenvolvimento Material II-Bimestre Conceitos de lógica.
Linguagem de Programação I
Paulo Marques Hernâni Pedroso
Elsa Carvalho 49 Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
O Essencial sobre Linguagens de Programação Luís Caires Maio 2005.
Shell Script Professor: João Paulo
Software Básico Silvio Fernandes Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Aula.
Programação para Engenharia I
Linguagens de Programação Orientadas a Objetos
Artur Rauen Luciano Peixoto
Programação Básica em Java
Programação Orientada a Aspectos
Rafael Pinto Frederico Corrêa
Linguagens de programação
Arrays Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs.: Luciana Nedel, Júlio Machado e Bernardo Copstein) Arrays Exercícios.
1 Professor Rogério B. de Andrade - Aula 001- Dez/2008 Técnicas e Linguagem de Programação.
7 Abstração Genérica Unidades genéricas e instanciação.
Centro Integrado de Tecnologia da Informação
Laboratório de Programação de Computadores I
Estrutura de Dados em Java
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Michel Pavan Macedo Introdução ao F# Michel Pavan Macedo
Introdução ao C# e ao visual studio
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Análise Semântica e Representação Intermédia
JAVA: Conceitos Iniciais
Implementar Listas em Linguagem Funcional II
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1.
DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso.
Curso básico de PHP 1 Vantagens: Gratuito Multiplataforma Estável Rapidez Comunicação.
JSON Programação de Script.
Linguagens imperativas: Aula prática
Haskell.
Programação I Aula 2 (Métodos)
Curso de ISI (Implantação de Sistemas de Informação)
Estudo dos Conceitos e Paradigmas de Programação
©André Santos, Programação Funcional Classes em Haskell André Santos.
Tópicos Avançados em Linguagens Computacionais – IF724
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Paradigma Funcional Apresentação de LF1.
Centro de Informática – UFPE
Características funcionais de C# 3.0
DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 FORMADOR Gonçalo Miguel MÓDULO 25. Introdução ao ActionScript 3.0.
Orientação a Objetos e Java Graduação em Ciência da Computação
PROGRAMAÇÃO PARA INTERNET Prof.: Jean Carlo Mendes
5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP 5COP101 Linguagens de Programação Aula 3 Clojure/LISP Prof. Dr. Sylvio Barbon Junior 1Sylvio.
Paradigma funcional.
Módulo I Capítulo 5: Vetores
Wagner Santos C. de Jesus
Linguagem de Programação C#
Paradigmas da Programação – Semestre 2 – Aula 13 Professor: Eduardo Mantovani Prof. Fábio de Paula Santos
UTILIZAÇÃO DA LINGUAGEM MS-VISUAL BASIC.NET Objetivo: apresentar os principais recursos da linguagem “Visual Basic” necessários à criação de macros para.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Java Kickstart, day 2 Semelhanças com linguagem C.
® Tópicos Avançados em Linguagens Computacionais – IF724 Aula Prática – FSharp (F#) Leandro Mitsuo Rodrigo Lumack Professor:
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Linguagem I Strings.
Módulo 9 Strings , Coleções e I/O
Fundamentos da Linguagem C#
Linguagens Funcionais: Haskell Prática 1 Paradigmas de Linguagens Computacionais Monitor: Guilherme Moura
1 Reestruturação das Linguagens da Disciplina “Paradigmas de Linguagens de Programação” para Java 1.5 Alunos: Angelo Ribeiro (arnpr) Eduardo Tavares (eagt)
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
©André Santos, Programação Funcional André Santos.
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Transcrição da apresentação:

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

Roteiro A linguagem Configurando o ambiente Sintaxe Referências 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 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

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

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

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

Configurando o Ambiente Baixar a última versão disponibilizada (F# CTP release) no link: http://research.microsoft.com/fsharp/release.aspx Descompactar o arquivo Executar o arquivo InstallFSharp.msi

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-1.9.6.2\bin\fsc.exe” hello.fs

F# em 2 minutos

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

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

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

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

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

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

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 { 1 .. 10 }

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)

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 = ()

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

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" }

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

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

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

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"

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 -> "1024" -> "4201" let result = rev (toStr (double 512)) let result = 512 |> double |> toStr |> rev

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

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”

Mais alguns exemplos

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]

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]

Referências Microsoft Research. Disponível em: http://research.microsoft.com/fsharp/manual/lexyacc.aspx. Último acesso em: 14/05/2008 SMITH, Chris. MSDN Blogs. Disponível em: http://blogs.msdn.com/chrsmith/archive/2008/05/02/f-in-20-minutes-part-i.aspx. Último acesso em: 14/05/2008 SEMPLE,Thomas Alexander. iMasters. Disponível em: http://imasters.uol.com.br/artigo/7750/dotnet/conheca_o_f. Último acesso em: 14/05/2008 Wikipedia. Disponível em: http://pt.wikipedia.org/wiki/ML_(linguagem_de_programa%C3%A7%C3%A3o). Último acesso em: 14/05/2008 Microsoft Research. Disponível em: http://www.microsoft.com/france/vision/mstechdays08/WebcastMSDN.aspx?EID=1 2841bd9-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.br