livro mini-curso de haskell

31

Upload: mikenandes

Post on 12-Apr-2017

241 views

Category:

Technology


0 download

TRANSCRIPT

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