Haskell - Diferenças de nomenclatura
26
1

Haskell - Diferenças de nomenclatura

Um tipo é como uma etiqueta para um valor ,eles são muito importantes porque ajudam na categorização dos nossos dados, dessa forma, permitem uma maior abstração na hora de criar nossas funções e nossas estruturas de dados. Ao invés de nos ate...

Luís Antônio11/09/2021
3 min
26
1

Tipo

Um tipo é como uma etiqueta para um valor, eles são muito importantes porque ajudam na categorização dos nossos dados, dessa forma, permitem uma maior abstração na hora de criar nossas funções e nossas estruturas de dados. Ao invés de nos atermos aos valores concretos conseguimos generalizar e dizer qual etiqueta conseguimos manipular.

somar :: Int -> Int -> Int
somar x y = x + y

No exemplo, a função somar recebe dois valores do tipo inteiro e retorna um terceiro valor também do tipo inteiro.

Classe

Em haskell, uma classe de tipos é uma coleção de tipos que habilita um ou mais operadores ou uma ou mais funções. Fazendo uma analogia com a programação orientada a objetos um tipo se assemelha muito a uma interface e um operador/função pode ser entendido como um método abstrato. Um exemplo mais concreto:

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

Estamos no terminal interativo da linguagem haskell, o ghci, e verificamos o tipo (:t) do operador de igualdade (==) e vemos (de forma resumida), que esse operador aceita como parâmetro um tipo a que obedece à restrição de tipos (Eq a) => da classe Eq. Dessa forma, se criarmos alguma estrutura própria e quisermos poder comparar duas instâncias dela por meio do operador de igualdade devemos implementá-lo. Vamos lá:

data Coisa a = Nada | UmaCoisa a | DuasCoisas a a deriving Show

No exemplo acima, definimos um tipo próprio chamado Coisa o qual aceita como parâmetro um tipo a e pode assumir os valores Nada, UmaCoisa a pense em algo como UmaCoisa Int, UmaCoisa Float, UmaCoisa Bool. Além disso, aceitamos guardar um par de valores do mesmo tipo, DuasCoisas Int Int por exemplo. Nota-se que, de forma resumida, o uso de deriving Show, acontece para que possamos printar os valores criados por Coisa no nosso terminal, em futuros posts vamos falar com mais detalhe sobre a cláusula deriving. A partir disso, podemos implementar o operador de igualdade:

instance Eq a => Eq (Coisa a) where
(DuasCoisas x1 y1) == (DuasCoisas x2 y2) = x1 == x2 && y1 == y2
(UmaCoisa x) == (UmaCoisa y) = x == y
Nada == Nada = True
_ == _ = False

Dizemos que o tipo Coisa é uma instância da classe Eq, além disso, definimos como o operador de igualdade irá funcionar em cada caso:

  1. Quando compararmos DuasCoisas elas serão iguais quando o primeiro e o segundo valores guardados delas forem iguais, respectivamente, x1 == x2 && y1 == y2.
  2. Quando recebermos dois parâmetros que são UmaCoisa analisaremos o valor guardado dentro deles, então se tivermos algo como UmaCoisa 5 == UmaCoisa 5 devolveremos True.
  3. Quando pegarmos dois valores que são Nada e Nada então devolveremos sempre True.
  4. Em quaisquer outros casos devolveremos False.

Métodos

Para entender o que são métodos podemos olhar a definição da Class Num:

class Num a where
(+), (-), (*) :: a -> a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a

Temos que, para definir um tipo como sendo instância de num devemos implementar os métodos:

  1. +, -, *.
  2. abs
  3. signum
  4. fromInterger

Então, métodos nada mais são que as funções que devem ser definidas quando instanciamos uma classe.

Instância

Após ter lido tudo acima torna-se fácil entender uma instância, nada mais que a definição dos métodos de uma classe para um tipo, assim, Coisa é uma instância da classe Eq.

Fontes:

  1. Haskell - Uma introdução a programação funcional
  2. Aprender Haskell será um grande bem para você
Support
More Options