SlideShare une entreprise Scribd logo
1  sur  45
Télécharger pour lire hors ligne
Programação Funcional com
Haskell
Prof. Iális Cavalcante
Fonte: Prof. Dr. Francisco Vieira

Engenharia da Computação – UFC/Sobral
0. Sumário
 Editor WinHugs
 Nomes
 Avaliação de funções
 Definições dos tipos das funções
 Associatividade
 Tipos de Dados
 Escopo
 Definições Locais
 Tratamento de Exceções
 Prova de Programas
1. Editor WinHugs
   :? – comando Help (o princípio de tudo)
:? 2 + 3 <enter>
5
:? (1 * 6) == (3 ‘div’ 5) <enter>
False
:? maximo (quadrado 2) 1 <enter>
4
                        Palavras reservadas:

      case     else     infix    module        type
      class    hiding   infixl   of            where
      data     if       infixr   renaming
      default import    instance               then
      deriving          in       let           to
1. Editor WinHugs (exemplo.hs)
{-##############################################
exemplo.hs
Este arquivo eh um exemplo de um arquivo .hs. Os programas aqui
   mostrados podem ser conseguidos na pagina de Haskell:
   http://www.haskell.org que contem links importantes para quem
   quer fazer parte de listas de usuarios de Haskell em todo mundo.
###############################################-}
resposta :: Int -- Uma constante inteira
resposta = 42
novalinha :: Char
novalinha = ’n’
sim :: Bool
sim = True
1. Editor WinHugs (exemplo.hs)
maior :: Bool
maior = (resposta > 71)
quadrado :: Int -> Int
quadrado x = x*x
todosIguais :: Int -> Int -> Int -> Bool
todosIguais n m p = (n == m) && (m == p)
{-##########################-}
1. Editor WinHugs
                        Principais comandos de Hugs
Comando               Ação realizada
:?                    Aciona o help
:e                    Chama o script atual
:e exemplo.hs         Edita o arquivo exemplo.hs
:l exemplo.hs         Carrega o script exemplo.hs e limpa outros arquivos carregados
:a exemplo.hs         Carrega o script exemplo.hs sem limpar os outros arquivos
:q                    Termina a sessão



        Ver Prelude.hs;
        Roteiro:
        ◦ Criar código-fonte: *.hs
        ◦ Carregar no WinHugs (:l ou :load)
        ◦ Executar suas funções
1. Editor WinHugs
 Comentários no código:
 ◦ com “- -”, que representa um comentário até o final da linha
   corrente;
 ◦ ou com os símbolos “{-” e “-}” envolvendo todo o texto a se
   tornar um comentário, que podem englobar até várias linhas
 Uma função, em Haskell, pode ser representada
 graficamente por uma caixa que recebe um ou mais
 parâmetros como entrada, processa estes
 parâmetros e constrói um resultado que é único.
 A aplicação de uma função consiste no processo se
 colocar os parâmetros na função.
                                          resultado
    parâmetro(s)              função
2. Nomes
  Os nomes em Haskell são sensíveis a caracteres
  ◦ as letras maiúsculas são distintas das letras minúsculas.
  Os nomes, também chamados de identificadores, devem
  ser iniciados
  ◦ sempre por uma letra maiúscula, se for um tipo,
  ◦ ou minúscula, se for uma variável ou o nome de alguma função.
  Estes nomes são seguidos, opcionalmente, por uma seqüência
  de letras maiúsculas ou minúsculas, dígitos, sublinhado ou
  acentos agudos.
  As palavras reservadas da linguagem são sempre escritas em
  letras minúsculas.
type Par = (Int, Int)
somaAmbos :: Par -> Int
somaAmbos (primeiro, segundo) = primeiro + segundo
3. Avaliação de funções
 leftmost-outermost
 avaliação preguiçosa (lazy evaluation)
  ◦ só avalia uma expressão se ela for realmente
    necessária e no máximo uma vez (avaliação
    curto-circuito).
 Testar:
todosIguais (quadrado 3) resposta (quadrado 2)
3. Avaliação de funções (cont.)

   todosIguais (quadrado 3) resposta (quadrado 2)



todosIguais (quadrado 3) resposta (quadrado 2)
= ((quadrado 3) == resposta) && (resposta == (quadrado 2))
= ((3 * 3) == resposta) && (resposta == (quadrado 2))
= (9 == resposta) && (resposta == (quadrado 2))
= (9 == 42) && (42 == (quadrado 2))
= False && (42 == (quadrado 2)) (utilizando lazy evaluation)
= False
4. Definições dos tipos das funções
 Um tipo é uma coleção de valores onde todos eles têm as mesmas
 características.
  ◦ Por exemplo, os números inteiros, os quadros, os caracteres, os strings de
    caracteres, etc.
 Em Haskell, se incentiva que todos os parâmetros de entrada e a
 saída tenham seus tipos explicitados pelo programador como uma
 forma de facilitar a checagem de tipos e de evitar muitos erros de
 programação.
  ◦ No entanto, os tipos podem também ser inferidos a partir das definições das
    funções.
 + :: Int -> Int -> Int e
 escala :: Quadro -> Int -> Quadro
                Int                              Int
                Int                  +

           Quadro                                Quadro
                                   escala
              Int
5. Associatividade
Prioridade   Assoc. à esquerda            Não associativa               Assoc. `a direita
    9           !, !!, //, > . >                 >>=                             .
    8                                                                        **, ˆ, ˆˆ
    7                              % , /, ‘div‘, ‘mod‘, ‘rem‘, ‘quot‘
    6                +, -                         :+
    5                                                                    :, ++, > + >
    4                                   /=, <, <=, = =, >, >=,
                                          ‘elem‘, ‘notElem‘
    3                                                                          &&
    2                                                                           ||
    1                                             :=
    0                                                                           $
5.1. Testes
 eZero :: Int -> Bool
 eZero 0 = True
 eZero _ = False

 fat :: Int -> Int
 fat 0 = 1
 fat n = n * fat (n -1)
6. Tipos de dados
 Admite:
 ◦ tipos primitivos e;
 ◦ tipos estruturados;
    tipos definidos pelo usuário a partir de outros
    tipos.
 Os tipos primitivos:
 ◦ inteiro (Int ou Integer), booleano (Bool),
   caractere (Char), cadeia de caracteres
   (String), ponto flutuante (Float ou Double)
   e o tipo lista.
6.1. Tipo Inteiro
 Os valores do tipo Integer são representados com o dobro da
 quantidade de bits necessários para representar os valores do tipo
 Int.
          Operadores aritméticos para valores dos tipos
          +, *                 adição e multiplicação
            ˆ                      exponenciação
            -      subtração (infixa) e inversor de sinal (prefixa)
           div        divisão inteira (prefixa), ou ‘div‘ (infixa)
          mod            módulo (prefixa), ou ‘mod‘ (infixa)
           abs             valor absoluto de um inteiro
         negate             troca o sinal de um inteiro


            Operadores relacionais: Int −> Int −> Bool
                        >, >=, ==, / =, <=, <
6.1. Tipo Inteiro
   Exemplo: série de fibonacci
0, 1, 1, 2, 3, 5, 8, 13, ...

fibonacci :: Int -> Int
fibonacci 1 = 0
fibonacci 2 = 1
fibonacci n = fibonacci(n-1) + fibonacci(n-2)


mdc :: Int -> Int -> Int
mdc n m
   |m == n = n
   |m > n = mdc m n
   |otherwise = mdc (n - m) m
6.2. Tipo Bool
  Os únicos valores booleanos são True e False

      Função     Nome                     Tipo
       &&          and      && :: Bool − > Bool − > Bool
        ||         or          || :: Bool − > Bool − > Bool
       not       inversor         not :: Bool − > Bool



  A função Ou exclusivo
exOr :: Bool -> Bool -> Bool
exOr True x = not x
exOr False x = x
6.3. O tipo caractere
 São literais escritos entre aspas simples.
      Caracteres especiais para utilizações específicas
   ‘t’         tabulação         ‘”      aspas simples
   ‘n’         nova linha        ‘”’     aspas duplas
   ‘’    uma barra invertida   ‘34’           ?


 funções pré-definidas em Haskell feitas para
 converter caracteres em números e vice-versa.
 ◦ toEnum :: Int − > Char
 ◦ fromEnum :: Char − > Int
6.4. O tipo cadeia de caracteres
 Os criadores de Haskell admitiram duas
 formas para este tipo:
 ◦ É um tipo predefinido;
    podem ser escritos entre aspas duplas
    “Constantino”
 ◦ Ou pode ser considerado como uma lista de
   caracteres
    Descrita como type String = [Char]
    usando a notação de lista de caracteres (entre aspas
    simples).
    [’C’, ’o’, ’n’, ’s’, ’t’, ’a’, ’n’, ’t’, ’i’, ’n’, ’o’].
6.4. O tipo cadeia de caracteres
 Exemplos:
 ◦   “baleia”− > baleia
 ◦   −>
 ◦   “99a116”− > cat
 ◦   “jeri”++ “qua”++ “quara”− > jeriquaquara

 Exercício:
 ◦ Defina uma função charToName :: Char − > Int que converte
   um dígito em seu valor (por exemplo, ‘8’ em 8). O valor de um
   caractere não dígito deve ser 0 (zero).
6.5. O tipo ponto flutuante
 Os valores do tipo ponto flutuante (números reais) pertencem aos
 tipos Float ou Double;
 A diferenças entre os valores destes tipos se verificam na
 quantidade de bits necessários para representá-los.
6.6. Os tipos de dados estruturados
 Os tipos estruturados são construídos a partir
 de outros tipos, sejam eles primitivos ou
 estruturados.
 Tipo produto cartesiano:
 ◦ representado em Haskell pelas tuplas;
 ◦ representado registros ou estruturas em linguagens
   imperativas
 ◦ o tipo (t1, t2, ..., tn) consiste de tuplas de valores (v1,
   v2, ..., vn) onde v1 :: t1, v2 :: t2, ..., vn :: tn
6.6. Os tipos de dados estruturados
 Exemplo:
 ◦ type Pessoa = (String, String, Int)
 ◦ maria :: Pessoa
 ◦ maria = ("Maria das Dores", "225-0000", 22)


 ◦ intP :: (Int, Int)
 ◦ intP = (35, 45)


 ◦ somaPar :: (Int, Int) -> Int
 ◦ somaPar (x, y) = x + y


 ◦ shift :: ((Int, Int), Int) -> (Int, (Int, Int))
 ◦ shift ((a,b),c) = (a, (b,c))
6.6. Os tipos de dados estruturados
 Mais exemplos:
 ◦ nome :: Pessoa -> String
 ◦ fone :: Pessoa -> String
 ◦ idade :: Pessoa -> Int


 ◦ nome (n, p, a) = n
 ◦ fone (n, p, a) = p
 ◦ idade (n, p, a) = a


 ◦ somaPar :: (Int, Int) -> Int
                                   Requer um argumento: tupla
 ◦ somaPar (a, b) = a + b
                                          Cuidado, são diferentes!!!
 ◦ somaDois :: Int -> Int -> Int
 ◦ somaDois a b = a + b            Requer dois argumentos
7. Escopo
  O escopo de uma definição é a parte de um programa
  na qual ela é visível e portanto pode ser usada.
  Em Haskell, o escopo das definições é todo o script.

ehImpar, ehPar :: Int -> Bool
ehImpar 0 = False
ehImpar n = ehPar (n-1)

ehPar 0 = True
ehPar n = ehImpar (n-1)
8. Definições Locais
  Através de palavras reservadas: where, let, in, if, then,
  else, ...

somaQuadrados :: Int -> Int -> Int
somaQuadrados n m = quadN + quadM
                  where
                      quadN = n * n
                      quadM = m * m

let x = 3 + 2; y = 5 - 1 in x^2 + 2*x*y - y
8. Definições Locais
  As definições locais são visíveis apenas na equação onde elas
  foram declaradas. As variáveis que aparecem do lado
  esquerdo também podem ser usadas em definições locais.
maxq :: Int -> Int -> Int
maxq x y
     |sqx > sqy = sqx
     |otherwise = sqy
                where
                     sqx = sq x
                     sqy = sq y
                     sq :: Int -> Int
                     sq z = z * z
8. Definições Locais
       As definições locais podem ser usadas antes que elas sejam
       definidas e também podem ser usadas em resultados, em guardas
       ou em outras definições locais.
    maxThreeOccurs :: Int -> Int -> Int -> (Int, Int)
    maxThreeOccurs n m p = (max, eqCount)
                      where
                            max = maxiThree n m p
                            eqCount = equalCount max n m p
                            maxiThree :: Int -> Int -> Int -> Int
                            maxiThree a b c = maximo (maximo (a, b), c)
                            equalCount :: Int -> Int -> Int -> Int -> Int

equalCount val n m p                     equalCount val n m p
= isN + isM + isP                        = isval n + isval m + isval p
    where                                    where
      isN = if n == val then 1 else 0           isval :: Int − > Int
      isM = if m == val then 1 else 0           isval x = if x == val then 1 else 0
      isP = if p == val then 1 else 0
8.1 Cálculo
 Um exemplo bastante conhecido é o de encontrar as
 raízes reais de uma equação do segundo grau. Neste
 caso teremos como entrada a equação a * xˆ2 + b * x +
 c = 0.
 Para construirmos esta solução, a saída será a string “A
 equação 1.0 * x^2 + 5.0 * x + 6.0= 0.0 tem duas raízes
 reais e distintas: -2.0 e -3.0”.
 Para isto vamos construir duas funções, sendo uma para
 o caso da função ter duas raízes reais e distintas e a
 outra para o caso dela ter duas raízes reais e iguais.
8.1 Cálculo
umaRaiz :: Float -> Float -> Float -> Float
umaRaiz a b c = -b / (2.0 * a)

duasRaizes :: Float -> Float -> Float -> (Float, Float)
duasRaizes a b c = (d + e, d - e)
      where
         d = -b/(2.0*a)
         e = sqrt (b^2 - 4.0*a*c)/(2.0*a)

saida :: Float -> Float -> Float -> String
saida a b c = cabecalho a b c ++ raizes a b c
8.1 Cálculo
cabecalho :: Float -> Float -> Float -> String
cabecalho a b c = "A equacao nnt"++ show a ++ "*x^2 + " ++
       show b ++ "*x + " ++ show c ++ " = 0.0" ++ "nntem "

raizes:: Float -> Float -> Float -> String
raizes a b c
   | b^2 > 4.0*a*c = "duas raizes reais e distintas: " ++ show f ++ "
   e " ++ show s
   | b^2 == 4.0*a*c = "duas raizes reais e iguais: " ++ show
   (umaRaiz a b c)
   | otherwise = "nenhuma raiz real "
         where (f, s) = duasRaizes a b c
9. Tratamento de Exceções
  O tratamento de exceções é uma forma de se programar
  que previne a ocorrência de erros devido a entradas não
  previstas
  ◦ ao tempo em que indica quais as providências que o computador deve
    tomar no caso dessas entradas ocorrerem
  ◦ sem ter que necessariamente abortar o programa ou deixar que ele
    entre em loops infinitos até extinguir toda a memória.
  No caso da equação do segundo grau, quando a entrada para
  o coeficiente a for zero, não será possível a divisão de
  qualquer número por ele.

umaRaiz a b c
     |(a /= 0.0) = -b/ (2.0 * a)
     |otherwise = error "umaRaiz chamada com a == 0"
10. Prova de Programas
 Uma prova é uma argumentação lógica ou matemática para
 verificar se alguma premissa é ou não válida em quaisquer
 circunstâncias.
 Este tema tem importância fundamental na construção de
 programas, uma vez que deve-se ter a garantia de que o
 programa esteja correto e que ele resolva exatamente o problema
 para o qual foi codificado.
 No entanto, existe um dilema: aversão pela prova de programas.
 Por se acreditar que é uma técnica de fundamentação matemática
 e, portanto, teórica.
 A prova de programas em qualquer linguagem imperativa é
 realmente tediosa, no entanto, ela se torna quase natural em
 uma linguagem funcional como Haskell.
10. Prova de Programas
 No entanto, um cuidado deve ser tomado,
 para que se evitem alguns erros de
 avaliação. A avaliação de uma expressão
 pode:
 ◦ parar e dar uma resposta (totalVendas 2).
    O valor da expressão é definido, ou
 ◦ nunca parar (totalVendas (-2)).
    O valor da expressão é indefinido.
 Qual o valor de 0*e?
10. Prova de Programas
 Existem em Haskell três formas de se
 formalizar provas: a prova direta, a prova
 por casos e a prova por indução
 matemática.
 10.1. Prova Direta
 ◦ A verificação da prova direta é feita pela
   aplicação das definições das funções.
10.1. Prova Direta
troca :: (Int, Int) -> (Int, Int)
troca (a, b) = (b, a)

cicla, recicla :: (Int, Int, Int) -> (Int, Int, Int)
cicla (a, b, c) = (b, c, a)
recicla (a, b, c) = (c, a, b)

  troca (troca (a, b)) = (a, b)?
  cicla (recicla (a, b, c)) = recicla (cicla (a, b, c))?
10.2. Prova por Casos
 maximo :: Int -> Int -> Int
 maximo n m
      |n >= m = n
      |otherwise = m
    Assertiva: “Para quaisquer números n e m, maximo n m >= n”?.

Para quaisquer números m e n definidos, tem-se: m > n ou n >= m.
Então, se n >= m: maximo n m = n. Portanto, maximo n m >= n.
Se m > n: maxi n m = m e m > n. Portanto, maximo n m > n.
Logo, maximo n m >= n.
10.3. Prova por Indução Matemática
 10.3.1. Indução Matemática
 ◦ Sistemas de Provas -> Especificação Formal
 ◦ Para provar que uma propriedade P(n) é
   válida para todo natural n, deve-se:
    Caso base: Provar P(n), para n = 0.
    Passo indutivo: Para n > 0, provar P(n), assumindo
    que P(n-1) é válida.

    fatorial 0 = 1 -- (fat 1)
    fatorial n = n * fatorial (n - 1) -- (fat 2)
    Como provar?
10.3. Prova por Indução Matemática
Podemos agora provar a seguinte propriedade
dos naturais:
◦ P(n): fatorial n > 0, para todo natural n.
O esquema de prova é feito da seguinte forma:
◦ Caso base (P(0)): fatorial 0 = 1 (por fat 1) e 1 > 0. Logo
  fatorial 0 > 0.
◦ Passo indutivo (P(n)): fatorial n = n * fatorial (n-1), (por
  fat 2) admitindo-se que n>0. A hipótese de indução
  informa que fatorial (n-1) > 0, ou seja, a propriedade P é
  válida para n-1.
10.3. Prova por Indução Matemática
Assim o fatorial de n é o produto de dois
fatores sendo ambos maiores que zero, ou
seja, temos >0 * >0. O produto de dois
números positivos é também positivo. Logo,
maior que 0.
Como a propriedade P é válida para o caso
base e para o passo indutivo, então ela é
válida para todo n natural. Esta última parte
é a conclusão da prova.
10.3. Prova por Indução Matemática
 10.3.2. Prova por Indução
 ◦ Enquanto uma indução formula provas para P(0), P(1), ..., a
   definição recursiva constrói resultados para fatorial 0, fatorial 1,
   ....
 ◦ Esta forma de prova normalmente é aplicada à funções definidas
   por recursão primitiva uma vez que representa tão somente um
   processo de tradução;
 ◦ Guia de passos a ser seguido nos esquemas de provas por
   indução em Haskell [Simon Thompson]
      Estágio 0: escrever o objeto da prova em linguagem natural,
      Estágio 1: escrever o objeto da prova em linguagem formal,
      Estágio 2: escrever os sub-objetos da prova por indução:
                   P(0):
                   P(n), para todo n>0, assumindo P(n-1)
      Estágio 3: Provar P(0)
      Estágio 4: Provar P(n), para n>0, lembrando que deve e pode usar P(n-1)
10.3. Prova por Indução Matemática
 Exemplo:
  power2 :: Int −> Int
  power2 0 = 1 (1)
  power2 r = 2 * power2 (r - 1) (2)

  sumPowers :: Int − > Int
  sumPowers 0 = 1 (3)
  sumPowers r = sumPowers (r-1) + power2 r (4)

Provar que sumPowers n + 1 = power2 (n + 1).
10.3. Prova por Indução Matemática
Estágio 0: provar que a soma das potências de 2 de 0 a n,
  adicionada a 1 é igual a (n + 1)-ésima potência de 2.
Estágio 1: provar P(n): sumPowers n + 1 = power2 (n+1)
Estágio 2: sumPowers 0 + 1 = = power2 (0 + 1), para n = 0?
          sumPowers n + 1 = = power2 (n + 1), para n > 0?,
          assumindo que sumPowers (n - 1) + 1 = power2 n
Estágio 3: sumPowers 0 + 1 = 1 + 1 = 2 –por (3)
          power2 (0 + 1) = 2 * power2 0 = 2 * 1 = 2 –por (2)
          logo, a prova é válida para o caso base.
     sumPowers n + 1 = sumPowers (n-1) + power2 n + 1 –por (4)
     = sumPowers(n-1) + 1 + power2 n –pela comutatividade de +
     = power2 n + power2 n –pela hip. de indução
     = 2 * power2 n
     = power2 (n+1) –por (2)
10.3. Prova por Indução Matemática
Exercícios:

◦ Prove que, para todo número natural n,
fac (n + 1) >= power2 n.

◦ Prove que, para todo número natural n,
fib (n+1) >= power2 (n div 2).
Resumo
 Em Haskell, uma função é uma operação que
 transforma suas entradas em uma saída.
 Um tipo é uma coleção de objetos similares.
 Todo objeto deve ter um tipo claramente
 definido.
 As funções definidas em um programa em
 Haskell podem ser usadas na avaliação de
 expressões.
 Tipos de dados primitivos e as tuplas.
 Exceções e provas.

Contenu connexe

Tendances

Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência JavaMario Jorge Pereira
 
Java 03 Tipos Dados Operadores
Java 03 Tipos Dados OperadoresJava 03 Tipos Dados Operadores
Java 03 Tipos Dados OperadoresRegis Magalhães
 
Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Helder da Rocha
 
Haskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classesHaskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classesCRISLANIO MACEDO
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUACândido Sales Gomes
 
02. tipos de_dados,_constantes_e_variáveis
02. tipos de_dados,_constantes_e_variáveis02. tipos de_dados,_constantes_e_variáveis
02. tipos de_dados,_constantes_e_variáveisGilson Bezerra
 
Estrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaEstrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaAdriano Teixeira de Souza
 
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...Manuel Menezes de Sequeira
 
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...Manuel Menezes de Sequeira
 

Tendances (19)

Apostila c++
Apostila c++Apostila c++
Apostila c++
 
Guia rapido java v2
Guia rapido java v2Guia rapido java v2
Guia rapido java v2
 
Atribuições
AtribuiçõesAtribuições
Atribuições
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Java 03 Tipos Dados Operadores
Java 03 Tipos Dados OperadoresJava 03 Tipos Dados Operadores
Java 03 Tipos Dados Operadores
 
Fundamentos do java
Fundamentos do javaFundamentos do java
Fundamentos do java
 
Manual básico de conversão de pseudocódigo para C#
Manual básico de conversão de pseudocódigo para C#Manual básico de conversão de pseudocódigo para C#
Manual básico de conversão de pseudocódigo para C#
 
Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014Swift em 45 minutos - TDC Sao Paulo 2014
Swift em 45 minutos - TDC Sao Paulo 2014
 
Haskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classesHaskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classes
 
Estrutura de Dados - Ponteiros
Estrutura de Dados - PonteirosEstrutura de Dados - Ponteiros
Estrutura de Dados - Ponteiros
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
08.type systems
08.type systems08.type systems
08.type systems
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
5.II SACIC - 2010 - Desenvolvimento de Aplicações para TVDigital com NCLUA
 
02. tipos de_dados,_constantes_e_variáveis
02. tipos de_dados,_constantes_e_variáveis02. tipos de_dados,_constantes_e_variáveis
02. tipos de_dados,_constantes_e_variáveis
 
Estrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memóriaEstrutura de Dados - Alocação dinâmica de memória
Estrutura de Dados - Alocação dinâmica de memória
 
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
 
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
 

Similaire à Programação Funcional com Haskell

Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando CVinícius Hax
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cppRUI VIEIRA
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Marco Mendes
 
Resumo tipo primitivo_java
Resumo tipo primitivo_javaResumo tipo primitivo_java
Resumo tipo primitivo_javaMarcos Souza
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
Python em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosPython em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosRudá Moura
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosGregorio Kusowski
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: IntroduçãoWesley R. Bezerra
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de ProgramaçãoCarlos Schults
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compactoLuciano Ramalho
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonDiogo Gomes
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 

Similaire à Programação Funcional com Haskell (20)

Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando C
 
Haskell
HaskellHaskell
Haskell
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 
01 variaveis io if
01 variaveis io if01 variaveis io if
01 variaveis io if
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Resumo tipo primitivo_java
Resumo tipo primitivo_javaResumo tipo primitivo_java
Resumo tipo primitivo_java
 
Python 02
Python 02Python 02
Python 02
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Java Básico
Java BásicoJava Básico
Java Básico
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
Trabalho
TrabalhoTrabalho
Trabalho
 
Python em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosPython em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhos
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: Introdução
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Java2
Java2Java2
Java2
 

Plus de Ialis Cavalcante (15)

Assembleia com os Discentes - SACEC
Assembleia com os Discentes - SACECAssembleia com os Discentes - SACEC
Assembleia com os Discentes - SACEC
 
Minicurso Ercemapi 2011
Minicurso Ercemapi 2011Minicurso Ercemapi 2011
Minicurso Ercemapi 2011
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
Unidade06
Unidade06Unidade06
Unidade06
 
Introducao ao greenfoot
Introducao ao greenfootIntroducao ao greenfoot
Introducao ao greenfoot
 
Dinamicas
DinamicasDinamicas
Dinamicas
 
Interface grafica
Interface graficaInterface grafica
Interface grafica
 
Unidade05
Unidade05Unidade05
Unidade05
 
Unidade04
Unidade04Unidade04
Unidade04
 
Unidade03
Unidade03Unidade03
Unidade03
 
Unidade02
Unidade02Unidade02
Unidade02
 
Técnicas de PDI com Java - Ercemapi 2009
Técnicas de PDI com Java - Ercemapi 2009Técnicas de PDI com Java - Ercemapi 2009
Técnicas de PDI com Java - Ercemapi 2009
 
CCT 23Maio2009 Sobral
CCT 23Maio2009 SobralCCT 23Maio2009 Sobral
CCT 23Maio2009 Sobral
 
Introducao ao LaTeX
Introducao ao LaTeXIntroducao ao LaTeX
Introducao ao LaTeX
 

Dernier

5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMHELENO FAVACHO
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxLuizHenriquedeAlmeid6
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇJaineCarolaineLima
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteVanessaCavalcante37
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médiorosenilrucks
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxMauricioOliveira258223
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxferreirapriscilla84
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdfLeloIurk1
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?AnabelaGuerreiro7
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfmaurocesarpaesalmeid
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfEmanuel Pio
 
Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Ilda Bicacro
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOFASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOAulasgravadas3
 

Dernier (20)

5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptx
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptx
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOFASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
 

Programação Funcional com Haskell

  • 1. Programação Funcional com Haskell Prof. Iális Cavalcante Fonte: Prof. Dr. Francisco Vieira Engenharia da Computação – UFC/Sobral
  • 2. 0. Sumário Editor WinHugs Nomes Avaliação de funções Definições dos tipos das funções Associatividade Tipos de Dados Escopo Definições Locais Tratamento de Exceções Prova de Programas
  • 3. 1. Editor WinHugs :? – comando Help (o princípio de tudo) :? 2 + 3 <enter> 5 :? (1 * 6) == (3 ‘div’ 5) <enter> False :? maximo (quadrado 2) 1 <enter> 4 Palavras reservadas: case else infix module type class hiding infixl of where data if infixr renaming default import instance then deriving in let to
  • 4. 1. Editor WinHugs (exemplo.hs) {-############################################## exemplo.hs Este arquivo eh um exemplo de um arquivo .hs. Os programas aqui mostrados podem ser conseguidos na pagina de Haskell: http://www.haskell.org que contem links importantes para quem quer fazer parte de listas de usuarios de Haskell em todo mundo. ###############################################-} resposta :: Int -- Uma constante inteira resposta = 42 novalinha :: Char novalinha = ’n’ sim :: Bool sim = True
  • 5. 1. Editor WinHugs (exemplo.hs) maior :: Bool maior = (resposta > 71) quadrado :: Int -> Int quadrado x = x*x todosIguais :: Int -> Int -> Int -> Bool todosIguais n m p = (n == m) && (m == p) {-##########################-}
  • 6. 1. Editor WinHugs Principais comandos de Hugs Comando Ação realizada :? Aciona o help :e Chama o script atual :e exemplo.hs Edita o arquivo exemplo.hs :l exemplo.hs Carrega o script exemplo.hs e limpa outros arquivos carregados :a exemplo.hs Carrega o script exemplo.hs sem limpar os outros arquivos :q Termina a sessão Ver Prelude.hs; Roteiro: ◦ Criar código-fonte: *.hs ◦ Carregar no WinHugs (:l ou :load) ◦ Executar suas funções
  • 7. 1. Editor WinHugs Comentários no código: ◦ com “- -”, que representa um comentário até o final da linha corrente; ◦ ou com os símbolos “{-” e “-}” envolvendo todo o texto a se tornar um comentário, que podem englobar até várias linhas Uma função, em Haskell, pode ser representada graficamente por uma caixa que recebe um ou mais parâmetros como entrada, processa estes parâmetros e constrói um resultado que é único. A aplicação de uma função consiste no processo se colocar os parâmetros na função. resultado parâmetro(s) função
  • 8. 2. Nomes Os nomes em Haskell são sensíveis a caracteres ◦ as letras maiúsculas são distintas das letras minúsculas. Os nomes, também chamados de identificadores, devem ser iniciados ◦ sempre por uma letra maiúscula, se for um tipo, ◦ ou minúscula, se for uma variável ou o nome de alguma função. Estes nomes são seguidos, opcionalmente, por uma seqüência de letras maiúsculas ou minúsculas, dígitos, sublinhado ou acentos agudos. As palavras reservadas da linguagem são sempre escritas em letras minúsculas. type Par = (Int, Int) somaAmbos :: Par -> Int somaAmbos (primeiro, segundo) = primeiro + segundo
  • 9. 3. Avaliação de funções leftmost-outermost avaliação preguiçosa (lazy evaluation) ◦ só avalia uma expressão se ela for realmente necessária e no máximo uma vez (avaliação curto-circuito). Testar: todosIguais (quadrado 3) resposta (quadrado 2)
  • 10. 3. Avaliação de funções (cont.) todosIguais (quadrado 3) resposta (quadrado 2) todosIguais (quadrado 3) resposta (quadrado 2) = ((quadrado 3) == resposta) && (resposta == (quadrado 2)) = ((3 * 3) == resposta) && (resposta == (quadrado 2)) = (9 == resposta) && (resposta == (quadrado 2)) = (9 == 42) && (42 == (quadrado 2)) = False && (42 == (quadrado 2)) (utilizando lazy evaluation) = False
  • 11. 4. Definições dos tipos das funções Um tipo é uma coleção de valores onde todos eles têm as mesmas características. ◦ Por exemplo, os números inteiros, os quadros, os caracteres, os strings de caracteres, etc. Em Haskell, se incentiva que todos os parâmetros de entrada e a saída tenham seus tipos explicitados pelo programador como uma forma de facilitar a checagem de tipos e de evitar muitos erros de programação. ◦ No entanto, os tipos podem também ser inferidos a partir das definições das funções. + :: Int -> Int -> Int e escala :: Quadro -> Int -> Quadro Int Int Int + Quadro Quadro escala Int
  • 12. 5. Associatividade Prioridade Assoc. à esquerda Não associativa Assoc. `a direita 9 !, !!, //, > . > >>= . 8 **, ˆ, ˆˆ 7 % , /, ‘div‘, ‘mod‘, ‘rem‘, ‘quot‘ 6 +, - :+ 5 :, ++, > + > 4 /=, <, <=, = =, >, >=, ‘elem‘, ‘notElem‘ 3 && 2 || 1 := 0 $
  • 13. 5.1. Testes eZero :: Int -> Bool eZero 0 = True eZero _ = False fat :: Int -> Int fat 0 = 1 fat n = n * fat (n -1)
  • 14. 6. Tipos de dados Admite: ◦ tipos primitivos e; ◦ tipos estruturados; tipos definidos pelo usuário a partir de outros tipos. Os tipos primitivos: ◦ inteiro (Int ou Integer), booleano (Bool), caractere (Char), cadeia de caracteres (String), ponto flutuante (Float ou Double) e o tipo lista.
  • 15. 6.1. Tipo Inteiro Os valores do tipo Integer são representados com o dobro da quantidade de bits necessários para representar os valores do tipo Int. Operadores aritméticos para valores dos tipos +, * adição e multiplicação ˆ exponenciação - subtração (infixa) e inversor de sinal (prefixa) div divisão inteira (prefixa), ou ‘div‘ (infixa) mod módulo (prefixa), ou ‘mod‘ (infixa) abs valor absoluto de um inteiro negate troca o sinal de um inteiro Operadores relacionais: Int −> Int −> Bool >, >=, ==, / =, <=, <
  • 16. 6.1. Tipo Inteiro Exemplo: série de fibonacci 0, 1, 1, 2, 3, 5, 8, 13, ... fibonacci :: Int -> Int fibonacci 1 = 0 fibonacci 2 = 1 fibonacci n = fibonacci(n-1) + fibonacci(n-2) mdc :: Int -> Int -> Int mdc n m |m == n = n |m > n = mdc m n |otherwise = mdc (n - m) m
  • 17. 6.2. Tipo Bool Os únicos valores booleanos são True e False Função Nome Tipo && and && :: Bool − > Bool − > Bool || or || :: Bool − > Bool − > Bool not inversor not :: Bool − > Bool A função Ou exclusivo exOr :: Bool -> Bool -> Bool exOr True x = not x exOr False x = x
  • 18. 6.3. O tipo caractere São literais escritos entre aspas simples. Caracteres especiais para utilizações específicas ‘t’ tabulação ‘” aspas simples ‘n’ nova linha ‘”’ aspas duplas ‘’ uma barra invertida ‘34’ ? funções pré-definidas em Haskell feitas para converter caracteres em números e vice-versa. ◦ toEnum :: Int − > Char ◦ fromEnum :: Char − > Int
  • 19. 6.4. O tipo cadeia de caracteres Os criadores de Haskell admitiram duas formas para este tipo: ◦ É um tipo predefinido; podem ser escritos entre aspas duplas “Constantino” ◦ Ou pode ser considerado como uma lista de caracteres Descrita como type String = [Char] usando a notação de lista de caracteres (entre aspas simples). [’C’, ’o’, ’n’, ’s’, ’t’, ’a’, ’n’, ’t’, ’i’, ’n’, ’o’].
  • 20. 6.4. O tipo cadeia de caracteres Exemplos: ◦ “baleia”− > baleia ◦ −> ◦ “99a116”− > cat ◦ “jeri”++ “qua”++ “quara”− > jeriquaquara Exercício: ◦ Defina uma função charToName :: Char − > Int que converte um dígito em seu valor (por exemplo, ‘8’ em 8). O valor de um caractere não dígito deve ser 0 (zero).
  • 21. 6.5. O tipo ponto flutuante Os valores do tipo ponto flutuante (números reais) pertencem aos tipos Float ou Double; A diferenças entre os valores destes tipos se verificam na quantidade de bits necessários para representá-los.
  • 22. 6.6. Os tipos de dados estruturados Os tipos estruturados são construídos a partir de outros tipos, sejam eles primitivos ou estruturados. Tipo produto cartesiano: ◦ representado em Haskell pelas tuplas; ◦ representado registros ou estruturas em linguagens imperativas ◦ o tipo (t1, t2, ..., tn) consiste de tuplas de valores (v1, v2, ..., vn) onde v1 :: t1, v2 :: t2, ..., vn :: tn
  • 23. 6.6. Os tipos de dados estruturados Exemplo: ◦ type Pessoa = (String, String, Int) ◦ maria :: Pessoa ◦ maria = ("Maria das Dores", "225-0000", 22) ◦ intP :: (Int, Int) ◦ intP = (35, 45) ◦ somaPar :: (Int, Int) -> Int ◦ somaPar (x, y) = x + y ◦ shift :: ((Int, Int), Int) -> (Int, (Int, Int)) ◦ shift ((a,b),c) = (a, (b,c))
  • 24. 6.6. Os tipos de dados estruturados Mais exemplos: ◦ nome :: Pessoa -> String ◦ fone :: Pessoa -> String ◦ idade :: Pessoa -> Int ◦ nome (n, p, a) = n ◦ fone (n, p, a) = p ◦ idade (n, p, a) = a ◦ somaPar :: (Int, Int) -> Int Requer um argumento: tupla ◦ somaPar (a, b) = a + b Cuidado, são diferentes!!! ◦ somaDois :: Int -> Int -> Int ◦ somaDois a b = a + b Requer dois argumentos
  • 25. 7. Escopo O escopo de uma definição é a parte de um programa na qual ela é visível e portanto pode ser usada. Em Haskell, o escopo das definições é todo o script. ehImpar, ehPar :: Int -> Bool ehImpar 0 = False ehImpar n = ehPar (n-1) ehPar 0 = True ehPar n = ehImpar (n-1)
  • 26. 8. Definições Locais Através de palavras reservadas: where, let, in, if, then, else, ... somaQuadrados :: Int -> Int -> Int somaQuadrados n m = quadN + quadM where quadN = n * n quadM = m * m let x = 3 + 2; y = 5 - 1 in x^2 + 2*x*y - y
  • 27. 8. Definições Locais As definições locais são visíveis apenas na equação onde elas foram declaradas. As variáveis que aparecem do lado esquerdo também podem ser usadas em definições locais. maxq :: Int -> Int -> Int maxq x y |sqx > sqy = sqx |otherwise = sqy where sqx = sq x sqy = sq y sq :: Int -> Int sq z = z * z
  • 28. 8. Definições Locais As definições locais podem ser usadas antes que elas sejam definidas e também podem ser usadas em resultados, em guardas ou em outras definições locais. maxThreeOccurs :: Int -> Int -> Int -> (Int, Int) maxThreeOccurs n m p = (max, eqCount) where max = maxiThree n m p eqCount = equalCount max n m p maxiThree :: Int -> Int -> Int -> Int maxiThree a b c = maximo (maximo (a, b), c) equalCount :: Int -> Int -> Int -> Int -> Int equalCount val n m p equalCount val n m p = isN + isM + isP = isval n + isval m + isval p where where isN = if n == val then 1 else 0 isval :: Int − > Int isM = if m == val then 1 else 0 isval x = if x == val then 1 else 0 isP = if p == val then 1 else 0
  • 29. 8.1 Cálculo Um exemplo bastante conhecido é o de encontrar as raízes reais de uma equação do segundo grau. Neste caso teremos como entrada a equação a * xˆ2 + b * x + c = 0. Para construirmos esta solução, a saída será a string “A equação 1.0 * x^2 + 5.0 * x + 6.0= 0.0 tem duas raízes reais e distintas: -2.0 e -3.0”. Para isto vamos construir duas funções, sendo uma para o caso da função ter duas raízes reais e distintas e a outra para o caso dela ter duas raízes reais e iguais.
  • 30. 8.1 Cálculo umaRaiz :: Float -> Float -> Float -> Float umaRaiz a b c = -b / (2.0 * a) duasRaizes :: Float -> Float -> Float -> (Float, Float) duasRaizes a b c = (d + e, d - e) where d = -b/(2.0*a) e = sqrt (b^2 - 4.0*a*c)/(2.0*a) saida :: Float -> Float -> Float -> String saida a b c = cabecalho a b c ++ raizes a b c
  • 31. 8.1 Cálculo cabecalho :: Float -> Float -> Float -> String cabecalho a b c = "A equacao nnt"++ show a ++ "*x^2 + " ++ show b ++ "*x + " ++ show c ++ " = 0.0" ++ "nntem " raizes:: Float -> Float -> Float -> String raizes a b c | b^2 > 4.0*a*c = "duas raizes reais e distintas: " ++ show f ++ " e " ++ show s | b^2 == 4.0*a*c = "duas raizes reais e iguais: " ++ show (umaRaiz a b c) | otherwise = "nenhuma raiz real " where (f, s) = duasRaizes a b c
  • 32. 9. Tratamento de Exceções O tratamento de exceções é uma forma de se programar que previne a ocorrência de erros devido a entradas não previstas ◦ ao tempo em que indica quais as providências que o computador deve tomar no caso dessas entradas ocorrerem ◦ sem ter que necessariamente abortar o programa ou deixar que ele entre em loops infinitos até extinguir toda a memória. No caso da equação do segundo grau, quando a entrada para o coeficiente a for zero, não será possível a divisão de qualquer número por ele. umaRaiz a b c |(a /= 0.0) = -b/ (2.0 * a) |otherwise = error "umaRaiz chamada com a == 0"
  • 33. 10. Prova de Programas Uma prova é uma argumentação lógica ou matemática para verificar se alguma premissa é ou não válida em quaisquer circunstâncias. Este tema tem importância fundamental na construção de programas, uma vez que deve-se ter a garantia de que o programa esteja correto e que ele resolva exatamente o problema para o qual foi codificado. No entanto, existe um dilema: aversão pela prova de programas. Por se acreditar que é uma técnica de fundamentação matemática e, portanto, teórica. A prova de programas em qualquer linguagem imperativa é realmente tediosa, no entanto, ela se torna quase natural em uma linguagem funcional como Haskell.
  • 34. 10. Prova de Programas No entanto, um cuidado deve ser tomado, para que se evitem alguns erros de avaliação. A avaliação de uma expressão pode: ◦ parar e dar uma resposta (totalVendas 2). O valor da expressão é definido, ou ◦ nunca parar (totalVendas (-2)). O valor da expressão é indefinido. Qual o valor de 0*e?
  • 35. 10. Prova de Programas Existem em Haskell três formas de se formalizar provas: a prova direta, a prova por casos e a prova por indução matemática. 10.1. Prova Direta ◦ A verificação da prova direta é feita pela aplicação das definições das funções.
  • 36. 10.1. Prova Direta troca :: (Int, Int) -> (Int, Int) troca (a, b) = (b, a) cicla, recicla :: (Int, Int, Int) -> (Int, Int, Int) cicla (a, b, c) = (b, c, a) recicla (a, b, c) = (c, a, b) troca (troca (a, b)) = (a, b)? cicla (recicla (a, b, c)) = recicla (cicla (a, b, c))?
  • 37. 10.2. Prova por Casos maximo :: Int -> Int -> Int maximo n m |n >= m = n |otherwise = m Assertiva: “Para quaisquer números n e m, maximo n m >= n”?. Para quaisquer números m e n definidos, tem-se: m > n ou n >= m. Então, se n >= m: maximo n m = n. Portanto, maximo n m >= n. Se m > n: maxi n m = m e m > n. Portanto, maximo n m > n. Logo, maximo n m >= n.
  • 38. 10.3. Prova por Indução Matemática 10.3.1. Indução Matemática ◦ Sistemas de Provas -> Especificação Formal ◦ Para provar que uma propriedade P(n) é válida para todo natural n, deve-se: Caso base: Provar P(n), para n = 0. Passo indutivo: Para n > 0, provar P(n), assumindo que P(n-1) é válida. fatorial 0 = 1 -- (fat 1) fatorial n = n * fatorial (n - 1) -- (fat 2) Como provar?
  • 39. 10.3. Prova por Indução Matemática Podemos agora provar a seguinte propriedade dos naturais: ◦ P(n): fatorial n > 0, para todo natural n. O esquema de prova é feito da seguinte forma: ◦ Caso base (P(0)): fatorial 0 = 1 (por fat 1) e 1 > 0. Logo fatorial 0 > 0. ◦ Passo indutivo (P(n)): fatorial n = n * fatorial (n-1), (por fat 2) admitindo-se que n>0. A hipótese de indução informa que fatorial (n-1) > 0, ou seja, a propriedade P é válida para n-1.
  • 40. 10.3. Prova por Indução Matemática Assim o fatorial de n é o produto de dois fatores sendo ambos maiores que zero, ou seja, temos >0 * >0. O produto de dois números positivos é também positivo. Logo, maior que 0. Como a propriedade P é válida para o caso base e para o passo indutivo, então ela é válida para todo n natural. Esta última parte é a conclusão da prova.
  • 41. 10.3. Prova por Indução Matemática 10.3.2. Prova por Indução ◦ Enquanto uma indução formula provas para P(0), P(1), ..., a definição recursiva constrói resultados para fatorial 0, fatorial 1, .... ◦ Esta forma de prova normalmente é aplicada à funções definidas por recursão primitiva uma vez que representa tão somente um processo de tradução; ◦ Guia de passos a ser seguido nos esquemas de provas por indução em Haskell [Simon Thompson] Estágio 0: escrever o objeto da prova em linguagem natural, Estágio 1: escrever o objeto da prova em linguagem formal, Estágio 2: escrever os sub-objetos da prova por indução: P(0): P(n), para todo n>0, assumindo P(n-1) Estágio 3: Provar P(0) Estágio 4: Provar P(n), para n>0, lembrando que deve e pode usar P(n-1)
  • 42. 10.3. Prova por Indução Matemática Exemplo: power2 :: Int −> Int power2 0 = 1 (1) power2 r = 2 * power2 (r - 1) (2) sumPowers :: Int − > Int sumPowers 0 = 1 (3) sumPowers r = sumPowers (r-1) + power2 r (4) Provar que sumPowers n + 1 = power2 (n + 1).
  • 43. 10.3. Prova por Indução Matemática Estágio 0: provar que a soma das potências de 2 de 0 a n, adicionada a 1 é igual a (n + 1)-ésima potência de 2. Estágio 1: provar P(n): sumPowers n + 1 = power2 (n+1) Estágio 2: sumPowers 0 + 1 = = power2 (0 + 1), para n = 0? sumPowers n + 1 = = power2 (n + 1), para n > 0?, assumindo que sumPowers (n - 1) + 1 = power2 n Estágio 3: sumPowers 0 + 1 = 1 + 1 = 2 –por (3) power2 (0 + 1) = 2 * power2 0 = 2 * 1 = 2 –por (2) logo, a prova é válida para o caso base. sumPowers n + 1 = sumPowers (n-1) + power2 n + 1 –por (4) = sumPowers(n-1) + 1 + power2 n –pela comutatividade de + = power2 n + power2 n –pela hip. de indução = 2 * power2 n = power2 (n+1) –por (2)
  • 44. 10.3. Prova por Indução Matemática Exercícios: ◦ Prove que, para todo número natural n, fac (n + 1) >= power2 n. ◦ Prove que, para todo número natural n, fib (n+1) >= power2 (n div 2).
  • 45. Resumo Em Haskell, uma função é uma operação que transforma suas entradas em uma saída. Um tipo é uma coleção de objetos similares. Todo objeto deve ter um tipo claramente definido. As funções definidas em um programa em Haskell podem ser usadas na avaliação de expressões. Tipos de dados primitivos e as tuplas. Exceções e provas.