Aula 19

haskell interativo

haskell compilado - rextester

1 Versão infixa de funcoes binarias

se f é uma função binaria, então `f` é uma versão infixa dessa função

max 4 19
4 `max` 19

elem _ [] = False
elem x (a:as) 
   | x == a = True 
   | otherwise = elem a as 

3 `elem` [4,5,6,7]

2 Tipos

:t no modo interativo imprime o tipo da expressão

:t 6
:t True
:t head

Tipos básicos

  • Int - inteiro de maquina
  • Integer - inteiro sem limites
  • Float
  • Double
  • Bool
  • Char

Tipos compostos

  • [a] : lista de a
  • a -> b : função que recebe a e devolve b
  • (a,b) : tupla de a e b
  • os tipos internos nao precisam estar definidos ou ser tipos basicos
:t head

:t max
  • a -> b -> c é uma funcao que recebe a e b e retorna c (1a versao OK).
  • na verdade é para ser interpretado como a -> (b -> c) uma funcao que recebe a e retorna uma funcao que espera receber b para retornar c

3 Curying

Todas as funções em Haskell são (podem ser vistas como) funções de 1 só argumento

max 31 10  ==>  (max 31)         10
                (funcao a -> a)  10   => a

ii = max 31

:t ii

ii 10

4 Typeclass

Hierarquia de tipos e restrições

:t head
head :: [a] -> a

:t max
max :: Ord a => a -> a -> a

:t (+)
(+) :: Num a => a -> a -> a
  • Ord tipos para os quais < e > estão definidos
  • Num tipos para os quais +,- (* /) estão definidos
  • Eq tipos com igualdade

5 Inferindo tipos

conta l = if null l then 0 else 1 + conta (tail l)

:t conta

6 Especificando o tipo de uma função

ultimo :: [a] -> a
ultimo [x] = x
ultimo (x:xs) = ultimo xs

Especificar o tipo pode ajudar a achar erros

reverte [] = []
reverte (x:xs) = reverte xs ++ x

main = print $ reverte [1,2,3]
reverte :: [a] -> [a]
reverte [] = []
reverte (x:xs) = reverte xs ++ x

main = print $ reverte [1,2,3]

7 lazy evaluation e thunk

take 0 _ = []
take n (x:xs) = x : take (n-1) xs

take 5 [20..100]

take 5 [20..]

take 5 $ drop 10 [100..]
  • listas não são criadas por inteiro
  • listas são um um "objeto" que é capaz de computar o próximo elemento da lista thunk
  • take n (x:xs) pega o próximo elemento s e xs continua sendo esse objeto
  • take (n-1) xs é um novo thunk
  • essas pilhas de promessas de computação só é executada em certas condições. Print no modo interativo ou compilado é uma delas

8 exercícios (da aula passado)

Se possível faça as 2 versões (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-05-02 Wed 11:29

Emacs 25.1.1 (Org mode 8.2.10)

Validate