Jump to content
Gustavo Martins

Dúvidas em exercícios

Recommended Posts

Gustavo Martins

Olá a todos, sou meio iniciante em haskell e estou em dúvida nesse exercicio.

1) A função min no Haskell retorna o menor entre dois números, por exemplo, min 4 5 = 4

. Crie um tipo min com um campo inteiro, que seja instância de Ord, Eq e Show (deriving)

.Crie uma instancia de Monoid para min (maxBound representa o maior inteiro existente no Haskell)

.Quanto vale a expressão Min(-32) <> Min(-34) <> Min(-33)?

. Explique sua escolha para o mempty

 

Quem puder me ajudar ficarei agradecido.

Share this post


Link to post
Share on other sites
Baderous

Para começar deves ler esta documentação: http://learnyouahaskell.com/functors-applicative-functors-and-monoids#monoids

A definição do tipo de dados é básica:

data Min = Min Int deriving (Eq, Ord, Show)

Depois é pedido para que o tipo Min seja declarado como uma instância da classe Monoid. Para tal, precisas de definir as funções mempty e mappend.

Citação

The first function is mempty. It's not really a function, since it doesn't take parameters, so it's a polymorphic constant, kind of like minBound from Bounded. mempty represents the identity value for a particular monoid.

Next up, we have mappend, which, as you've probably guessed, is the binary function. It takes two values of the same type and returns a value of that type as well.

(...)

A monoid is when you have an associative binary function and a value which acts as an identity with respect to that function. When something acts as an identity with respect to a function, it means that when called with that function and some other value, the result is always equal to that other value.

Portanto, o enunciado já te dá a função binária que goza da propriedade associativa (min), bem como o valor que representa a identidade perante tal função (maxBound). Com esta informação facilmente defines esta instanciação:

instance Monoid Min where
        mempty = maxBound
        mappend (Min x) (Min y) = Min (min x y)

Como estás a usar a constante polimórfica maxBound, precisas de declarar que o tipo Min instancia a classe Bounded. A forma mais fácil é adicionar essa classe à lista de tipos derivados na definição do tipo Min:

data Min = Min Int deriving (Eq, Ord, Show, Bounded)

Porque é que mempty corresponde ao maxBound? Porque maxBound, quando aplicado ao tipo Int, representa o maior inteiro representável (2147483647). E qualquer inteiro, quando comparado com este valor, será sempre menor (i.e., "min"). Portanto, sempre que à função min passares um valor X e maxBound, esta devolverá sempre X.

Assim, podes testar este código da seguinte forma:

> Min (-32) `mappend` Min (-34) `mappend` Min (-33)
Min (-34)
> mempty `mappend` Min (-50)
Min (-50)
> (mempty::Min) `mappend` (mempty::Min)
Min 2147483647

A função mappend no fundo representa a função (<>).

Como vês, o resultado destas funções é sempre um Monoid Min (e.g., Min (-34)). Se quiseres ter alguma flexibilidade para extrair o inteiro nele contido podes redefinir o tipo de dados Min tal como é feito no link que deixei no início:

newtype Min = Min {getInt :: Int} deriving (Eq, Ord, Show, Bounded)

Depois, podes então extrair o inteiro via função getInt:

> mempty `mappend` Min 3
Min {getInt = 3}
> getInt $ mempty `mappend` Min 3
3

 

Edited by Baderous

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.