Escolar Documentos
Profissional Documentos
Cultura Documentos
Universidade de Braslia
Rodrigo Bonifacio
26 de abril de 2012
Rodrigo Bonifacio Declara cao de tipos e classes
Relembrando . . .
Um tipo e uma colecao de valores relacionados.
O tipo Bool
contem os valores logicos True e False; enquanto que o tipo
Bool Bool contem todas as func oes que mapeiam valores
booleanos em resultados tambem do tipo booleando.
Em Haskell, toda expressao deve ter um tipo, que e calculado
antes de avaliar a expressao por um processo chamado de
inferencia de tipos.
Rodrigo Bonifacio Declara cao de tipos e classes
Relembrando . . .
Um tipo e uma colecao de valores relacionados. O tipo Bool
contem os valores logicos True e False
; enquanto que o tipo
Bool Bool contem todas as func oes que mapeiam valores
booleanos em resultados tambem do tipo booleando.
Em Haskell, toda expressao deve ter um tipo, que e calculado
antes de avaliar a expressao por um processo chamado de
inferencia de tipos.
Rodrigo Bonifacio Declara cao de tipos e classes
Relembrando . . .
Um tipo e uma colecao de valores relacionados. O tipo Bool
contem os valores logicos True e False; enquanto que o tipo
Bool Bool contem todas as func oes que mapeiam valores
booleanos em resultados tambem do tipo booleando.
Em Haskell, toda expressao deve ter um tipo, que e calculado
antes de avaliar a expressao por um processo chamado de
inferencia de tipos.
Rodrigo Bonifacio Declara cao de tipos e classes
Relembrando . . .
Um tipo e uma colecao de valores relacionados. O tipo Bool
contem os valores logicos True e False; enquanto que o tipo
Bool Bool contem todas as func oes que mapeiam valores
booleanos em resultados tambem do tipo booleando.
Em Haskell, toda expressao deve ter um tipo, que e calculado
antes de avaliar a expressao por um processo chamado de
inferencia de tipos.
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de sin onimos de tipos
Mecanismo usado para declarar um novo nome para um tipo
existente, sendo util para melhorar a compreensao do codigo.
type Side = Float
type Radius = Float
type Vertex = (Float, Float)
Sinonimos nao podem ser recursivos
(para criarmos tipos
recursivos, precisamos denir novos tipos usando a construcao
data.)
Por outro lado, type synonymous podem ser parametrizados:
Parser a = String -> [(a, String)]
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de sin onimos de tipos
Mecanismo usado para declarar um novo nome para um tipo
existente, sendo util para melhorar a compreensao do codigo.
type Side = Float
type Radius = Float
type Vertex = (Float, Float)
Sinonimos nao podem ser recursivos (para criarmos tipos
recursivos, precisamos denir novos tipos usando a construcao
data.)
Por outro lado, type synonymous podem ser parametrizados:
Parser a = String -> [(a, String)]
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de sin onimos de tipos
Mecanismo usado para declarar um novo nome para um tipo
existente, sendo util para melhorar a compreensao do codigo.
type Side = Float
type Radius = Float
type Vertex = (Float, Float)
Sinonimos nao podem ser recursivos (para criarmos tipos
recursivos, precisamos denir novos tipos usando a construcao
data.)
Por outro lado, type synonymous podem ser parametrizados:
Parser a = String -> [(a, String)]
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de novos tipos
Novos tipos podem ser criados usando a constru cao data.
data Shape = Rectangle Side Side
| Ellipse Radius Radius
| RtTriangle Side Side
| Polygon [Vertex]
Nesse caso, indicamos que um Shape pode ser um retangulo,
uma elipse, um triangulo retangulo ou um polgono.
Rectangle, Ellipse, RtTriangle, Polygon podem ser vistos como
tipos especiais de funcoes que servem para construir instancias
do tipo Shape sao construtores do tipo Shape.
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de novos tipos
Novos tipos podem ser criados usando a constru cao data.
data Shape = Rectangle Side Side
| Ellipse Radius Radius
| RtTriangle Side Side
| Polygon [Vertex]
Nesse caso, indicamos que um Shape pode ser um retangulo,
uma elipse, um triangulo retangulo ou um polgono.
Rectangle, Ellipse, RtTriangle, Polygon podem ser vistos como
tipos especiais de funcoes que servem para construir instancias
do tipo Shape sao construtores do tipo Shape.
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de novos tipos
Novos tipos podem ser criados usando a constru cao data.
data Shape = Rectangle Side Side
| Ellipse Radius Radius
| RtTriangle Side Side
| Polygon [Vertex]
Nesse caso, indicamos que um Shape pode ser um retangulo,
uma elipse, um triangulo retangulo ou um polgono.
Rectangle, Ellipse, RtTriangle, Polygon podem ser vistos como
tipos especiais de funcoes que servem para construir instancias
do tipo Shape
sao construtores do tipo Shape.
Rodrigo Bonifacio Declara cao de tipos e classes
Declaracao de novos tipos
Novos tipos podem ser criados usando a constru cao data.
data Shape = Rectangle Side Side
| Ellipse Radius Radius
| RtTriangle Side Side
| Polygon [Vertex]
Nesse caso, indicamos que um Shape pode ser um retangulo,
uma elipse, um triangulo retangulo ou um polgono.
Rectangle, Ellipse, RtTriangle, Polygon podem ser vistos como
tipos especiais de funcoes que servem para construir instancias
do tipo Shape sao construtores do tipo Shape.
Rodrigo Bonifacio Declara cao de tipos e classes
Valores de tipos denidos pelos usuarios podem ser
usados da mesma forma que os valores dos tipos
pre-denidos; ou seja, podemos, por exemplo,
denir funcoes que recebem Shapes como
argumento ou que retornam valores do tipo Shape.
Rodrigo Bonifacio Declara cao de tipos e classes
Novos tipos podem ser parametrizados
Uniformidade e uma caracterstica da linguagem
Haskell
data Maybe a = Nothing | Just a
O tipo Maybe e util para lidar com algumas situacoes de erro.
safediv :: Integer -> Integer -> Maybe Integer
safediv _ 0 = Nothing
safediv m n = Just (m div n)
safehead :: [a] -> Maybe a
safehead [] = Nothing
safehead (x:xs) = Just x
Rodrigo Bonifacio Declara cao de tipos e classes
Novos tipos podem ser parametrizados
Uniformidade e uma caracterstica da linguagem
Haskell
data Maybe a = Nothing | Just a
O tipo Maybe e util para lidar com algumas situacoes de erro.
safediv :: Integer -> Integer -> Maybe Integer
safediv _ 0 = Nothing
safediv m n = Just (m div n)
safehead :: [a] -> Maybe a
safehead [] = Nothing
safehead (x:xs) = Just x
Rodrigo Bonifacio Declara cao de tipos e classes
Novos tipos podem ser parametrizados
Uniformidade e uma caracterstica da linguagem
Haskell
data Maybe a = Nothing | Just a
O tipo Maybe e util para lidar com algumas situacoes de erro.
safediv :: Integer -> Integer -> Maybe Integer
safediv _ 0 = Nothing
safediv m n = Just (m div n)
safehead :: [a] -> Maybe a
safehead [] = Nothing
safehead (x:xs) = Just x
Rodrigo Bonifacio Declara cao de tipos e classes
Conforme mencionado, tipos denidos pelos
usuarios podem ser recursivos
Rodrigo Bonifacio Declara cao de tipos e classes
Por exemplo, listas e arvores tem deni coes recursivas
Implementacao de listas e arvore binaria:
data List a = Nil
| Cons a (List a)
data BTree a = Leaf a
| Node BTree a BTree
Podemos ter fun coes para vericar se um elemento existe na
arvore ou para transformar uma arvore em lista:
Rodrigo Bonifacio Declara cao de tipos e classes
occurs :: a -> BTree a -> Bool
occurs _ Leaf = False
occurs m (Node l i r) =
if (i == m)
then True
else (occurs m l) || (occurs m r)
flatten :: BTree a -> [Int]
flatten Leaf = []
flatten (Node l i r) = i : (flatten l ++ flatten r)
Rodrigo Bonifacio Declara cao de tipos e classes