21
©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

Embed Size (px)

Citation preview

Page 1: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Programação FuncionalClasses em Haskell

André Santos

Page 2: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Classes

• Usadas para permitir overloading de nomes– operação de igualdade ==

• diferentes significados para diferentes tipos

• Orientação a Objetos– herança

Page 3: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Funções polimórficas?

(==) :: t -> t -> Bool

(<) :: t -> t -> Bool

show :: t -> String

Page 4: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Funções monomórficas

• Definição funciona apenas para um tipo de dados específico

capitalize :: Char -> Char

capitalize ch = chr (ord ch + offset)

where offset = ord ’A’ - ord ’a’

Page 5: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Funções polimórficas

• Uma única definição pode ser usada para diversos tipos de dados

length :: [a] ->Int

length [] = 0

length (x:xs) = 1 + length xs

Page 6: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Overloading

• A função pode ser usada para vários (alguns) tipos de dados– diferentes definições para cada tipo

• Classe: coleção de tipos para os quais uma função está definida

• O conjunto de tipos para os quais (==) está definida é a classe igualdade, Eq

Page 7: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Definindo a classe igualdade

• Identifica-se o que é necessário para um tipo t ser da classe– nesse caso, ele deve possuir uma função (==)

definida sobre t, do tipo t -> t -> Bool

class Eq t where

(==) :: t -> t -> Bool

Page 8: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Instâncias

• Tipos membros de uma classe são chamadas instâncias

• São instâncias de Eq os tipos primitivos e as listas e tuplas de instâncias de Eq– Int, Float, Char, Bool, [Int], (Int,Bool),[[Char]], [(Int,[Bool])]

• Int -> Int não é instância da classe Eq• Instância de classe vs. Instância de um tipo

Page 9: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Funções que usam igualdade

allEqual :: Int -> Int -> Int -> Bool ?allEqual n m p = (n == m) && (m == p)

• Contexto – definido pela parte antes do operador “=>”

allEqual succ succ succ ?

member :: [Char] -> Char -> Bool ?member [] b = Falsemember (a:as) b = (a==b) || member as b

allEqual :: Eq t => t -> t -> t -> Bool

member :: Eq t => [t] -> t -> Bool

Page 10: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Outras funções

books :: Eq a => [(a,b)] -> a -> [b]

borrowed :: Eq u => [(t,u)] -> u -> Bool

numBorrowed :: Eq t => [(t,u)] -> t -> Int

Page 11: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Definido assinaturas de classes

• Funções (nome e tipo) que devem ser definidas para cada instância da classe

• Exemplo de uma assinatura de classe

class Visible t where

toString :: t -> String

size :: t -> Int

Page 12: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Definindo instâncias de uma classe

• Definir as funções da assinatura para um tipo• Exemplo de uma instância da classe Eq

instance Eq Bool where True == True = True False == False = True _ == _ = False

Page 13: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Exemplo de instâncias da classe Visible

instance Visible Char where toString ch = [ch] size _ = 1

instance Visible Bool where toString True = ”True” toString False = ”False” size _ = 1

Page 14: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Exemplo de instâncias da classe Visible

instance Visible t => Visible [t] where

toString = map toString >.> concat

size = map size >.> foldr (+) 0

Page 15: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Definições default

class Eq t where (==), (/=) :: t -> t -> Bool a /= b = not (a==b)

podem ser substituídas (overloaded)

Page 16: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Classes derivadas

class Eq t => Ord t where

(<),(<=),(>),(>=) :: t -> t -> Bool

max, min :: t -> t -> t

a <= b = (a < b || a == b)

a > b = b < a

a < b = b > a

a >= b = (a > b || a == b)

iSort :: Ord t => [t] ->[t]

Herança de operações

Page 17: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Restrições múltiplas

vSort = iSort >.> toString

vSort :: (Ord t, Visible t) => [t] -> String

instance (Eq t, Eq u) => Eq (t,u) where

(a,b) == (c,d) = (a == c && b == d)

class (Ord t, Visible t) => OrdVis t

Herança múltipla

Page 18: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Classes predefinidas

Eq, Ord

class (Ord t) => Enum t where enumFrom :: t -> [t] enumFromThen :: t -> t -> [t] enumFromTo :: t -> t -> [t] enumFromThenTo :: t -> t -> t -> [t]

[n .. ] [n,m .. ] [n .. m] [n,n’ .. m]

Page 19: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Classes predefinidas

show :: (Show t) => t -> String

read :: (Read t) => String -> t

Page 20: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Tipos Numéricos

Int, IntegerFloat, DoubleRationalComplexClasses Num, Fractional

rep 0 ch = []rep n ch = ch : rep (n-1) ch:type reprep :: Num a => a -> b -> [b]

Page 21: ©André Santos, 1998-2002 Programação Funcional Classes em Haskell André Santos

©André Santos, 1998-2002

Tipos vs. Classes

• Linguagens OO: tipos == classes– toString :: VisibleType -> String

• Ligação dinâmica– [True, ’N’, False] :: [VisibleType]

• Nomenclatura: Overloading vs. Polimorfismo– polimorfismo ad-hoc