Aula 18

haskell interativo

haskell compilado - rextester

1 pattern matching

funcoes em haskell podem ser escritas como diferentes "regras" com pattern matching como no Prolog

fatorial 0 = 1
fatorial x = x * fatorial (x-1)

2 pattern matchin para listas

A lista [1,2,3,9] pode ser representada como 1:[2,3,9] mas a lista vazia não pode

soma [] = 0
soma (x:xs) = x + soma xs

O parenteses no argumento da segunda regra é necessario pois o : tem menor precedencia que o branco

pattern matching funciona para tuplas, e o _ tambem é uma variavel anonima

primo (a,_,_) = a

segundo (_,x,_) = x

3 Guards

bmiTell weight height  
    | weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"  
    | weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"  
    | otherwise                 = "You're a whale, congratulations!"  

4 let

let: define variaveis e funcoes locais ANTES da expressao final

cylinder r h = 
    let sideArea = 2 * pi * r * h  
        topArea = pi * r ^2  
    in  sideArea + 2 * topArea  

5 where

where define variaveis e funcoes locais depois da expressao final

cylinder r h = sideArea + 2 * topArea 
   where sideArea = 2 * pi * r * h
         topArea = pi * r ^2  
soma x = soma' x 0
  where soma' [] s = s
        soma' (x:xs) s = soma' xs (x+s)
bmiTell weight height  
    | aux <= 18.5 = "You're underweight, you emo, you!"  
    | aux <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | aux <= 30.0 = "You're fat! Lose some weight, fatty!"  
    | otherwise                 = "You're a whale, congratulations!" 
   where aux = weight / height ^ 2

6 range

[2..10]

[2,5..30]

[10..2] - nao funciona

[10,9..2] - funciona

7 List Comprehension

[x**2 | x <- [1..10]]

[3*x | x <- [1,4..30], odd x] 

[3*x | x <- [1,4..30], odd x, x>12] 

[ x+y | x <- [2,5,10], y <- [8,10,11], x*y > 50]  

8 exercicios

Se possivel faça as 2 versoes (com e sem acumulador) de cada um desses exercicios SEM USAR as funcoes pre-definidas do haskell a nao ser ++ que é a concatenacao de listas

  • maior elemento de uma lista
  • ultimo elemento de uma lista
ultimo [x] = x
ultimo (_:xs) = ultimo xs
  • lista sem o ultimo elemento
  • apenas os elementos nas posicoes 1, 3. 5 etc da lista
posimpar [] = []
posimpar [a] = [a]
posimpar (a:b:resto) = a : posimpar resto
  • apenas os elementos positivos de uma lista de numeros
sopos l = [x | x<-l, x>0]
  • a soma dos elementos positivos de uma lista de numeros
  • retorna True se a lista estiver ordenada crescentemente
  • shift right (1 2 3 4) -> (4 1 2 3)
  • shift left (1 2 3 4) -> (2 3 4 1)
  • revere uma lista (1 2 3 4) -> (4 3 2 1)
  • conta quantas vezes um item aparece numa lista (conta item lista) (0 caso nao apareça)
  • em que posição um item aparece numa lista (-1 se nao aparece)
  • (remove item list) retorna a lista sem o item - em todas as vezes que ele aparece
  • (replace item novo lista) retorna lista onde todos os items foram trocado por novo

Author: Jacques Wainer

Created: 2018-04-25 Wed 11:36

Validate