Introdução à Programação:
uma Abordagem Funcional
PD I – Engenharia Elétrica
Prof.ª Claudia Boeres
2008/2
O que é um tipo de dado?
• um conjunto de valores, munido de um conjunto de
operações sobre esses valores.
• Exemplo: S = {0,1,2,3, ...}, munido das operações de
adição (a) e multiplicação (m).
• cada operação possui um tipo, indicando o domínio e o
contradomínio.
• Exemplo: o domínio de a é S X S e o contradomínio é
S.
Assinatura de a e de m:
a :: (S x) x → x → x
m :: (S x)  x → x → x
Tipos de dados

Básicos: numéricos, booleanos, caracteres

Compostos: tuplas e listas
Linguagem fortemente tipada


Em Haskell, conhecendo-se o tipo das
operações e funções que compõem uma
expressão podemos determinar o tipo do valor
que dela resultará
Em linguagens de programação isto equivale a
dizer que a linguagem é fortemente tipada.
Tipos Numéricos

Tipo de dados fundamental na computação

Inteiros e reais


Tratamentos de números pelo computador:
requer adaptações e simplificações.
Em HUGS é possível visualizar o tipo da
expressão avaliada através do comando :set +t
Exemplos
> :set +t
> 2^20
1048576 :: Integer
> :set -t
> 2^100
1267650600228229401496703205376
Números Inteiros



tipo Integer: representação de números com uma quantidade
ilimitada de algarismos.
a memória do computador é finita: limites de representação são
impostos;
o limite pode estar bem longe e podemos não atingí-lo em
nossas aplicações.
> 2^1000
1071508607186267320948425049060001810561404811705533
60744375038837035105112493612249319837881569585812
75946729175531468251871452856923140435984577574698
57480393456777482423098542107460506237114187795418
21530464749835819412673987675591655439460770629145
71196477686542167660429831652624386837205668069376
Números Inteiros



Tipo Int: representação de inteiros mais restrita
(intervalo fixo e reduzido de valores);
Economia de memória do computador e tempo de
processamento;
Para que um número seja representado como tipo Int,
devemos indicar explicitamente
Exemplos
> 1234567890::Int
1234567890 :: Int
> 12345678901::Int
Program error: arithmetic overflow
> 1089979879870979879
1089979879870979879 :: Integer
> 1089979879870979879::Int
Program error: arithmetic overflow
Operações sobre inteiros
Nome
Descrição
+
Adição
*
Multiplicação
-
Subtração
div, quot
divisão inteira
^
Potência
rem
resto da divisão inteira entre dois
inteiros
mod
módulo da divisão inteira entre dois
inteiros
abs
valor absoluto
signum
produz -1, 0 ou 1, indicando se o
número é negativo, zero ou
positivo
Números Reais







Tipo Float: representação dos números reais
Para a representação, considera-se a magnitude e a precisão
de um número;
Precisão: nos diz quantos algarismos significativos são usados;
Magnitude: nos diz qual o maior expoente admitido;
Exemplo:
 uma determinada implementação pode utilizar 6 algarismos
significativos: o número 123456.789 seria representado pelo
número 123457.0, onde o 6 foi arredondado para 7.
A magnitude permite a representação tanto de números bem
pequenos e bem grandes.
Exemplo:
 99999999999999999999999999999 → 1.0e+29
 0.00000000009999999999999999999999999999 → 1.0e010
Exemplos
>
0.123456789012345678901234567890123456
7890
0.123456789012346 :: Double
A representação científica é utilizada quando
necessário:
> 1234567890123456789012345678.9
1.23456789012346e+027 :: Double
A constante pi
> pi
3.14159265358979 :: Double
Operações sobre reais
Nome
Descrição
+
Adição
*
Multiplicação
-
Subtração
/
Divisão
^
potência (o expoente tem que ser Int e
positivo)
sin
Seno
cos
Coseno
tan
Tangente
sqrt
raiz quadrada
log
logaritmo na base e
logBase logaritmo na base escolhida
exp
potência na base e
Conversão de tipos
>3+5
8 :: Integer
> 3 + 5.0
8.0 :: Double
Conversão de tipos

Existem funções específicas para conversão de tipos:

a função truncate converte um real x para o menor inteiro menor ou
igual x.
> truncate pi
3 :: Integer

a função round converte um real x para o inteiro mais próximo de x, ou
seja:
round x = truncate (x + 0.5)
> round pi
3 :: Integer
> round (exp 1)
3 :: Integer
Conversão de tipos

As funções fromInteger e fromRational também
servem para conversão de tipos:
fromInteger :: (Num a) => Integer -> a
fromRational :: (Fractional a) => Rational -> a
Precedência dos operadores
1ª) div, mod, abs, sqrt e qualquer outra função
2ª) ^
3ª) * /
4ª) +, -
Exemplos
>2+3*5
17
> (2 + 3) * 5
25
> 3 * mod 10 4 + 5
11
> 3 ^ mod 10 4
9
> 4 ^ mod (div 20 4) 2
4
Ordem de associação

Quando há ocorrência de operadores de mesma
precedência leva-se em consideração a ordem de
associação que pode ser à direita ou à esquerda.
a) O operador unário deve ser sempre representado entre
parênteses quando utilizado junto com outro operador
(- x)^y ou - (x^y) e nunca -x^y ou x^-y
b) A potência, quando repetida em uma expressão, é
avaliada da direita para a esquerda
2^3^3 = 2^(3^3)
c) Os demais operadores, na situação acima, são
avaliados da esquerda para a direita
2 - 3 - 5 = (2 - 3) – 5 e 2 + 3 + 3 = (2 + 3) + 3
Exemplos
>3 - 7 - 2
-6
>3*7+4
25
> 3 * ( 7 + 4)
33
> 3 ^ ( 1 + 3)
81
Tipos de novas definições de
funções

As funções abaixo são de que tipo?
mediaA x y = (x + y) / 2
e
mediaB x y = truncate ((x + y) / 2)
Hierarquia de tipos
Eq, Ord: tudo menos I/O
Num: Int, Integer, Float, Double
Real: Int, Integer, Float, Double
Fractional: Float, Double
RealFrac: Float, Double
Floating: Float, Double
RealFloat: Float, Double
Integral: Int, Integer
Download

Slide 1 - claudiaboeres