Programação Funcional 8a. Seção de Slides Generalização em Haskell (2a. Parte)
Livro Mini-Curso de Haskell
-
Upload
mikenandes -
Category
Technology
-
view
242 -
download
0
Transcript of Livro Mini-Curso de Haskell
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Mini-Curso de Haskell - SEMAC 2013/1
Marcelo Garlet Millani
Universidade Federal do Rio Grande do Sul
Instituto de Informática
Grupo PET Computação
22 de maio de 2013
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
1 Básico de OpenGl
2 Quali�ed TypesDe�nindo ClassesAlgumas Classes Úteis
3 Functor e Monad
4 Handles
5 Referências
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
OpenGL
• OpenGl é uma biblioteca grá�ca
• Permite aproveitar a GPU para desenhos
• Capaz de trabalhar em 3D, mas usaremos apenas 2D
• GHC possui bindings para Haskell• Módulo Graphics.Rendering.OpenGL
• Pacote libghc-opengl-dev no Linux (Debian)
• Usaremos a GLUT (Graphics.UI.GLUT) para a janela• Pacote libghc-glut-dev no Linux (Debian)
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Inicialização
getArgsAndInitialize Inicializa a GLUT
createWindow Cria uma janela grá�ca
displayCallback Determina a função que será usada paradesenhar
mainLoop Inicia o processo de desenho
Exemplo
1 main = do2 g e t A r g s A n d I n i t i a l i z e3 createWindow " He l l o World"4 d i s p l a y C a l l b a c k $= d i s p l a y myPoints5 mainLoop
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Desenho
clear Limpa um bu�er
renderPrimitive Desenha uma primitiva do OpenGL
�ush Finaliza o desenho
vertex Especi�ca um vértice do polígono que está sendodesenhado
Exemplo
1 d i s p l a y p = do2 c l e a r [ C o l o rBu f f e r ]3 r e n d e r P r im i t i v e L ineLoop $ do4 mapM_ (\ ( x , y , z)−>ve r t e x $Ve r t e x 3 x y z ) p5 f l u s h
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Exercício
Exercício
Faça um programa que desenhe o triângulo de Sierpinski.
• Composto por triângulos retângulos isósceles• Divide-se em três regiões: direita, cima e centro• Cada região será composta por um triângulo com a metadedo lado
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
1 Básico de OpenGl
2 Quali�ed TypesDe�nindo ClassesAlgumas Classes Úteis
3 Functor e Monad
4 Handles
5 Referências
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Para que servem
• Uso de funções polimór�cas
• Restringem os tipos para os quais a função está de�nida
Exemplo
Função de soma:
1 (+) : : Num a=> a−>a−>a
De�nida para qualquer a tal que a seja um membro de Num.
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Como usar
• De�nimos como as funções da classe serão aplicadas paraum certo tipo de dado
• Em alguns casos, não é necessário de�nir todas as funções• Por exemplo, basta de�nir igualdade (==) para se terdiferença (/=)
Exemplo
1 instance Eq a => Eq ( F i gu r e a ) where2 C i r c l e r == C i r c l e s =3 r == s4 Rec tang l e w h == Rec tang l e a b =5 w == a && h == b6 _ == _ = False
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Derivação
• Algumas classes possuem suporte para derivação
• Usam uma implementação padrão para qualquer tipo dedado
• Funciona somente com:• Eq• Ord• Enum• Bounded• Show• Read
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Derivação
Exemplo
1 data Quad r i l a t e r o a = Retangu lo a a | Quadrado a2 de r i v i ng (Show ,Read ,Eq ,Ord )
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
De�nindo Classes
• Faremos uma classe para uniformizar o desenho deprimitivas
• Minimizaremos a in�uência do OpenGL
• Ter os vértices é o su�ciente para desenhar algo
Funções
1 c l a s s Drawable d where2 t oVe r t e x : : d −> ( Float , Float ) −>3 [ ( Float , Float ) ]4 draw : : Pr im i t i veMode −> d −>5 ( Float , Float ) −> IO ( )6 drawWire : : ( Float , Float ) −>7 d −> IO ( )
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Conversões
• OpenGL usa o tipo GL�oat
• Usaremos uma função para converter de Float para GL�oat
• Essa função pode �car fora da classe
Conversões
1 conve r tToGL f l oa t x = ( realToFrac x ) : : GL f l o a t2 c on v e r tPo i n t ( x , y ) =3 v e r t e x $ Ver tex2 ( conve r tToGL f l oa t x )4 ( conve r tToGL f l oa t y )
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Implementação
• Providenciaremos uma implementação padrão para draw edrawWire
• Basta fornecer uma implementação para toVertex
Funções
1 draw mode f i g u r e po i n t =2 r e n d e r P r im i t i v e mode $3 mapM_ c on v e r tPo i n t ( t oVe r t e x f i g u r e po i n t )4
5 drawWire po i n t f i g u r e =6 draw LineLoop f i g u r e po i n t
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Exercício
Exercício
Faça com que o tipo Figure seja um membro da classeDrawable. Com isso, desenhe um fractal que seja um círculodentro de um quadrado dentro de um círculo dentro de umquadrado . . .
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Eq
De�nição
1 c l a s s Eq a where2 (==), (/=) : : a −> a −> Bool3
4 x /= y = not ( x == y )5 x == y = not ( x /= y )
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Ord
De�nição
1 c l a s s (Eq a ) => Ord a where2 compare : : a −> a −> Ordering3 (<) , (<=), (>=), (>) : : a −> a −> Bool4 max , min : : a −> a −> a5
6 compare x y | x == y = EQ7 | x <= y = LT8 | otherwise = GT
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Ord (Continuação)
De�nição
1 −− c l a s s (Eq a ) => Ord a where2 x <= y = compare x y /= GT3 x < y = compare x y == LT4 x >= y = compare x y /= LT5 x > y = compare x y == GT
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Ord (Continuação)
De�nição
1 −− c l a s s (Eq a ) => Ord a where2 max x y | x <= y = y3 | otherwise = x4 min x y | x <= y = x5 | otherwise = y
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Exercício
Exercício
Estenda a de�nição de Figure para que ela faça parte da classeOrd. Use a área de �gura como critério.
• Para testar a sua de�nição, use a função sort e sortBy dabiblioteca Data.List
• sort :: Ord a => [a] -> [a]
• sortBy :: (a -> a -> Ordering) -> [a] -> [a]
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
1 Básico de OpenGl
2 Quali�ed TypesDe�nindo ClassesAlgumas Classes Úteis
3 Functor e Monad
4 Handles
5 Referências
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Functor
• De�ne um meio de transformar tipos de dados
Classe
1 c l a s s Functor f where2 fmap : : ( a −> b) −> f a −> f b
• f é um construtor
Propriedades Esperadas
1 fmap i d = i d2 fmap ( f . g ) = fmap f . fmap g
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Exemplo
Exemplo
1 instance Functor [ ] where2 fmap f [ ] = [ ]3 fmap f ( h : t l ) = f h : fmap f t l
• Comportamento igual ao da função map
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Monad
De�nição
1 c l a s s Monad m where2 (>>=) : : m a −> ( a −> m b) −> m b −− b ind3 (>>) : : m a −> m b −> m b −− sequence4 return : : a −> m a5 f a i l : : Str ing −> m a6
7 m >> k = m >>= \_ −> k8 f a i l s = e r ro r s
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Sintaxe do
• Apenas açúcar sintático
• Na realidade, utiliza os operadores de mônadas
Regras
1 do e2 −> e3 do e1 ; e2 ; . . . ; en4 −> e1 >> do e2 ; . . . ; e_n
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Monad
Regras
1 do pat <− e1 ; e2 ; . . . ; en2 −>3 l e t ok pat = do e2 ; . . . ; en4 ok _ = f a i l " . . . "5 i n e1 >>= ok
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Monad
Regras
1 do l e t d e c l l i s t ; e2 ; . . . ; en2 −> l e t d e c l l i s t i n do e2 ; . . . ; en
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
1 Básico de OpenGl
2 Quali�ed TypesDe�nindo ClassesAlgumas Classes Úteis
3 Functor e Monad
4 Handles
5 Referências
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Handles
• Usados para abrir um arquivo para diversas modi�cações
• São mais e�cientes do que funções como readFile ouwriteFile
• É necessário lembrar de fechar o arquivo
• Usa-se a biblioteca System.IO
Algumas Funções
1 openFi le : : Fi lePath −> IOMode −> IO Handle2 hClose : : Handle −> IO ( )3 hPutStr : : Handle −> Str ing −> IO ( )4 hGetChar : : Handle −> IO Char5 hGetLine : : Handle −> IO Str ing6 hGetContents : : Handle −> IO Str ing
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Exercício
Exercício
Faça um programa que escreva diversas �guras geométricas emum arquivo (usando a classe Show) e depois leia essas �gurasdo arquivo (usando Read). Trate o arquivo com handles. Deriveas classes em vez de implementá-las.
• hGetContents é uma função de leitura lazy
• Para conveniência, fechem o arquivo de leitura no �nal doprograma, em vez de no �nal da leitura.
• Existem alternativas melhores, como tratar o �nal doarquivo
Mini-Cursode Haskell -SEMAC2013/1
M. Millani
Básico deOpenGl
Quali�edTypes
De�nindoClassesAlgumasClasses Úteis
Functor eMonad
Handles
Referências
Referências
Hal Daumé III, Yet Another Haskell Tutorial
Hudak, Paul. The Haskell School of Expression
http:
//www.haskell.org/haskellwiki/OpenGLTutorial1
http://www.haskell.org/onlinereport