Gustavo Martins 0 Posted March 24, 2019 Report Share Posted March 24, 2019 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. Link to post Share on other sites
Baderous 31 Posted April 11, 2020 Report Share Posted April 11, 2020 (edited) 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 April 11, 2020 by Baderous Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now