Linguagem Haskell Riocemar S de Santana Haskell o

  • Slides: 37
Download presentation
Linguagem Haskell Riocemar S. de Santana

Linguagem Haskell Riocemar S. de Santana

Haskell, o que é? � É uma linguagem de programação puramente funcional, de propósito

Haskell, o que é? � É uma linguagem de programação puramente funcional, de propósito geral. � Nomeada em homenagem ao matemático americano Haskell B. Curry (1900– 1982). � Concebida para ensino e também para o desenvolvimento de aplicações reais. � Resultado de mais de vinte anos de investigação por uma comunidade de base acadêmica muito ativa. � Implementações abertas e livremente disponíveis. � Como uma linguagem funcional, a estrutura de controle primária é a função.

O que é a programação funcional? �É um paradigma de programação. �No paradigma imperativo,

O que é a programação funcional? �É um paradigma de programação. �No paradigma imperativo, um programa é uma sequência de instruções que mudam células na memória. �No paradigma funcional, um programa é um conjunto de definições de funções que são aplicadas a valores. �Podemos programar num estilo funcional em muitas linguagens. �Exemplos: Scheme, ML, O’Caml, Haskell, F#

Programação Funcional �A programação funcional modela um problema computacional como uma coleção de funções

Programação Funcional �A programação funcional modela um problema computacional como uma coleção de funções matemáticas, cada uma com um domínio de entrada e um resultado. �As funções interagem e combinam entre si usando composição funcional, condições e recursão.

Linguagem Haskell Exemplo �Para somar os números inteiros de 1 a 10 podemos escrever

Linguagem Haskell Exemplo �Para somar os números inteiros de 1 a 10 podemos escrever em linguagem C: int total = 0, i; for (i = 1; i <= 10; i++){ total = total + i; } �O método da computação é baseado em atribuição de valores à variáveis.

Linguagem Haskell Exemplo �A soma dos números inteiros de 1 a 10 em linguagem

Linguagem Haskell Exemplo �A soma dos números inteiros de 1 a 10 em linguagem Haskell pode ser feita como: >sum[1. . 10] �O método da computação é baseado em aplicação de argumentos à funções.

Win. Hugs

Win. Hugs

Win. Hugs �Hugs é uma implementação da linguagem Haskell que pode ser executada em

Win. Hugs �Hugs é uma implementação da linguagem Haskell que pode ser executada em PCs e sistemas Unix, incluindo Linux. �Pode ser obtido gratuitamente em http: //cvs. haskell. org/Hugs/pages/downloa ding. htm

Win. Hugs Suporte para: �Microsoft Windows �Debian GNU/Linux �Fedora Core (Linux) �Open. SUSE (Linux)

Win. Hugs Suporte para: �Microsoft Windows �Debian GNU/Linux �Fedora Core (Linux) �Open. SUSE (Linux) �Free. BSD �Mac OS X

Haskell – Função �Uma função pode ser representada da seguinte maneira: �A partir dos

Haskell – Função �Uma função pode ser representada da seguinte maneira: �A partir dos valores de entrada á obtido o valor de saída.

Haskell – Função �Funções em Haskell são normalmente definidas pelo uso de equações. �Por

Haskell – Função �Funções em Haskell são normalmente definidas pelo uso de equações. �Por exemplo, a função soma pode ser escrita: soma x y = x + y �Chamada da seguinte maneira: >soma 10 20 30

Haskell – Função �A função soma pode ser implementada em um arquivo (bloco de

Haskell – Função �A função soma pode ser implementada em um arquivo (bloco de notas) e salvo com a extensão. hs

Haskell – Função �Carregando o arquivo de funções: Hugs>: load ”caminho”

Haskell – Função �Carregando o arquivo de funções: Hugs>: load ”caminho”

Haskell – Função �Chamando a função soma: Main>soma 10 2

Haskell – Função �Chamando a função soma: Main>soma 10 2

Haskell – Função �Incluindo mais funções no arquivo: incrementa n = n + 1

Haskell – Função �Incluindo mais funções no arquivo: incrementa n = n + 1

Haskell – Função �Função que chama uma função:

Haskell – Função �Função que chama uma função:

Hugs Alguns comandos importantes:

Hugs Alguns comandos importantes:

Tipos básicos � A linguagem Haskell possui uma disciplina rigorosa de tipos de dados,

Tipos básicos � A linguagem Haskell possui uma disciplina rigorosa de tipos de dados, sendo fortemente tipada. Neste caso, toda função, variável, constante tem apenas um tipo de dado, que sempre pode ser determinado. � Embora fortemente tipada, a linguagem Haskell possui um sistema de dedução automática de tipos para funções cujos tipos não foram definidos. � A partir dos tipos pré-definidos na linguagem Haskell, novos tipos podem ser construídos pelo programador.

Tipos primitivos em Haskell �Para definir que uma expressão E tem o tipo T

Tipos primitivos em Haskell �Para definir que uma expressão E tem o tipo T (E é do tipo T) escreve-se E : : T-> Saida

Prototipação de tipos Exemplos: �-- Função que verifica se um número inteiro é par:

Prototipação de tipos Exemplos: �-- Função que verifica se um número inteiro é par: : Int->Bool par x = if mod x 2 == 0 then True else False �-- Função para converter um valor Fahrenheit em Celsius converte. FC: : Float->Float converte. FC x = (x - 32)/ 1. 8

Prototipação de tipos �Tipo Booleano: ◦ O tipo booleano é representado pela abreviatura Bool

Prototipação de tipos �Tipo Booleano: ◦ O tipo booleano é representado pela abreviatura Bool e possui os valores: True ou False. �Tipo Inteiro: ◦ Os inteiros são referenciados por Int, o domínio matemático dos inteiros (até 2147483647).

Funções do módulo Prelude O arquivo de biblioteca Prelude. hs oferece um grande número

Funções do módulo Prelude O arquivo de biblioteca Prelude. hs oferece um grande número de funções definidas no padrão da linguagem através do módulo Prelude. � even - verifica se um valor dado é par � odd - verifica se um valor dado é impar � rem - resto da divisão inteira � mod - resto da divisão inteira � ceiling - arredondamento para cima � floor - arredondamento para baixo � round - arredondamento para cima e para baixo � truncate - parte inteira do número � from. Integral - converte um inteiro em real � sin - seno de ângulo em radianos � cos - cosseno � tan – tangente

Funções do módulo Prelude (Cont. . . ) �asin - arco seno �acos -

Funções do módulo Prelude (Cont. . . ) �asin - arco seno �acos - arco cosseno �atan - arco tangente �abs - valor absoluto �sqrt - raiz quadrada, valor positivo apenas �exp - exponencial base e �log - logaritmo natural (base e) �log. Base - logaritmo na base dada �min - menor de 2 objetos dados �max - maior de 2 objetos dados

Listas e Tuplas � A linguagem Haskell nos fornece dois mecanismos para a construção

Listas e Tuplas � A linguagem Haskell nos fornece dois mecanismos para a construção de dados compostos: listas e tuplas. �A lista possibilita a união de vários elementos – todos do mesmo tipo - numa única estrutura. � Numa tupla podemos combinar os componentes de um dado numa única estrutura, e os componentes podem ter tipos e propriedades distintas

Listas Fundamento � Uma lista é uma estrutura de dados que representa uma coleção

Listas Fundamento � Uma lista é uma estrutura de dados que representa uma coleção de objetos homogêneos em sequência. � Para alcançar qualquer elemento, todos anteriores a ele devem ser recuperados. � Em os programação, uma lista vazia (representada por [ ] em Haskell) é a estrutura base da existência de uma lista.

Listas Fundamento � Uma lista é composta sempre de dois segmentos: cabeça (head) e

Listas Fundamento � Uma lista é composta sempre de dois segmentos: cabeça (head) e corpo (tail). A cabeça da lista é sempre o primeiro elemento. ['a', 'b', 'c', 'd'] "abcd" > 'a': ['b', 'c', 'd'] "abcd“

Listas Operador (: ) �O símbolo (: ) é o operador de construção de

Listas Operador (: ) �O símbolo (: ) é o operador de construção de listas. Toda lista é construída através deste operador. Exemplos: Hugs> 'a': ['b', 'c', 'd'] "abcd" Hugs> 2: [4, 6, 8] [2, 4, 6, 8]

Listas Hugs> 'a': ['b', 'c', 'd'] "abcd" Hugs> 1: [2, 3] [1, 2, 3]

Listas Hugs> 'a': ['b', 'c', 'd'] "abcd" Hugs> 1: [2, 3] [1, 2, 3] Hugs> ['a', 'c', 'f'] == 'a': ['c', 'f'] True Hugs> [1, 2, 3] == 1: 2: 3: [] True Hugs> 1: [2, 3] == 1: 2: [3] True Hugs> "papel" == 'p': ['a', 'p', 'e', 'l'] True

Escrevendo Listas Pode-se definir uma lista indicando os limites inferior e superior de um

Escrevendo Listas Pode-se definir uma lista indicando os limites inferior e superior de um conjunto conhecido, onde existe uma relação de ordem entre os elementos, no seguinte formato: [ <limite-inferior>. . <limite-superior> ] > [1. . 4] [1, 2, 3, 4] > ['m'. . 'n'] "mn" > [1, 3. . 6] [1, 3, 5] > ['a', 'd'. . 'p'] "adgjmp" > [3. 1. . 7] [3. 1, 4. 1, 5. 1, 6. 1, 7. 1] �

Escrevendo Listas Podemos definir qualquer progressão aritmética em uma lista utilizando a seguinte notação:

Escrevendo Listas Podemos definir qualquer progressão aritmética em uma lista utilizando a seguinte notação: [ <1 o. termo>, <2 o. termo>. . <limite-superior> ] � > [7, 6. . 3] [7, 6, 5, 4, 3] > [6, 5. . 0] [6, 5, 4, 3, 2, 1, 0] > [-5, 2. . 16] [-5, 2, 9, 16] > [5, 6. . 5] [5] > [1, 1. 1. . 2] [1. 0, 1. 1, 1. 2, 1. 3, 1. 4, 1. 5, 1. 6, 1. 7, 1. 8, 1. 9, 2. 0]

Listas por compreensão A descrição de uma lista pode ser feita em termos dos

Listas por compreensão A descrição de uma lista pode ser feita em termos dos elementos de uma outra lista. Por exemplo, temos a lista L 1 = [2, 4, 7]. � Uma lista definida por compreensão pode ser escrita: > [ 2 * n | n <- L 1 ] [4, 8, 14] � �A lista resultante contém todos os elementos da lista L 1, multiplicados por 2. Assim, podemos ler: Obtenha todos os 2*n dos elementos n contidos em L 1 = [2, 4, 7].

Listas por compreensão Exemplo: lista. Quad = [x^2 | x <- [1. . 30]]

Listas por compreensão Exemplo: lista. Quad = [x^2 | x <- [1. . 30]] >lista. Quad [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 28 9, 324, 361, 400, 441, 484, 529, 576, 625, 676, 7 29, 784, 841, 900] � lista. Quad. Inf = [ x^2 | x <- [1. . ] ] > lista. Quad. Inf [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 28 9, 324, 361, 400, 441, 484, 529, 576, 625, 676, 7 29, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 144 4, 1521, 1600. . . > elem 4 lista. Quad. Inf True � A função elem verifica se um elemento pertence a uma lista. Retorna True ou False

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Listas Funções Pré-definidas

Fim. �Referências ◦ http: //www-usr. inf. ufsm. br/~juvizzotto/elc 117 -2010 b/ ◦ http: //pt.

Fim. �Referências ◦ http: //www-usr. inf. ufsm. br/~juvizzotto/elc 117 -2010 b/ ◦ http: //pt. wikipedia. org ◦ http: //www 2. fct. unesp. br/docentes/dmec/olivete/lp/arquivos/A ula 14. pdf