Você está na página 1de 2

Programação funcional: functors, aplicative functors e monads

1. A teoria das categorias é uma teoria matemática, cujos preceitos auxiliam a


nortear a computação funcional. Em suma, ela trata de forma abstrata os valores
matemáticos e a relação
entre eles. Avalie as expressões a seguir e marque a alternativa que os define
conceitualmente.

0+10 == 10 + 0 == 10
[ ] ++ 1,2,3 == 1,2,3 ++ [ ] == [1,2,3]

R:A.Monoide.
Monoides seguem a teoria das categorias e o princípio da identidade, que diz que
duas expressões podem ser unidades, contanto que não produzam efeitos. Bind é o
principal operador
monádico. Funtor e funtor aplicativo são funções capazes de mapear estruturas
monádicas. Mônadas são estruturas que contêm valores e comportamentos que podem ser
utilizados em
outras funções com o auxílio de funtores.

2. Estruturas monádicas também têm a sua origem na teoria das categorias e utilizam
expressões algébricas para realizar computações que causam efeitos colaterais. Uma
mônada
utilizada em determinada função irá gerar outra estrutura de mesmo tipo. Sabendo
disso, dada a função main, que recebe uma string IO, marque a alternativa que
implementa
corretamente uma linha de código que recebe uma string e retorna uma mônada IO:
main :: IO ( )

R: B. main = getLine >> = putStrLn


Usando a função ou o operador bind (>>=), é possível aplicar uma mônada de modo que
a função main receba uma string IO e retorne uma mônada IO. Isso é possível por
meio do
operador >>= entre a função getLine, responsável pela entrada de strings, passa
pelo bind e retorna uma mônada IO por meio da função putSrLn.
A notação -> significa que uma função está recebendo algum parâmetro; a função
print apenas imprime na tela e não recebe nenhuma entrada.

3. Funtores são propriedades capazes de mapear um valor encapsulado, acessando o


contêiner para que a função possa executar a sua instrução utilizando um
determinado valor.
Baseado nisso, marque a alternativa que corresponde à função responsável pelo
encapsulamento desses diferentes tipos de dados:

R: C. Pure.
Dentro do conceito de funtores e funtores aplicativos, diz-se que funções (ou
valores) encapsuladas são acessadas e geram novas funções ou novos valores também
encapsulados. A função
pure realiza o encapsulamento desse novo valor gerado. A função print mostra um
resultado na tela. A fmap é um funtor capaz de acessar dados encapsulados. A função
getLine é um
comportamento da função IO ( ), responsável pela entrada de um dado no sistema.

4. A função ou o operador bind (>>=) retorna a uma função, elemento ou valor


monádico. No entanto, a notação do permite facilitar o trabalho com mônadas de
forma mais intuitiva em
relação às outras linguagens mais utilizadas.
Sabendo disso, assinale a alternativa que representa o correto uso da notação do na
linguagem Haskell:
R: A. main :: IO ( )
main = do
line <- getLine
putStrLn line

A função main recebe uma string IO vazia, em seguida, precisa-se declarar a notação
do dizendo que esta deve extrair resultado da função main. Em seguida, precisa-se
declarar uma
função de entrada e, finalmente, uma função de saída. Ponto e vírgula não são
utilizados em Haskell e a notação do tipo -> significa que uma função está
recebendo algum parâmetro. Neste
caso, precisa-se que a função main retorne algo e não receba. Portanto, a expressão
que representa a correta sintaxe da utilização da notação do é:

main :: IO ( )
main = do
line <- getLine
putStrLn line

5. A utilização de expressões algébricas, funtores e mônadas permite manipular os


mais diversos tipos de estruturas. Uma dessas estruturas são as listas em que os
valores extraídos a
partir da execução de uma dada instrução geram uma nova estrutura de mesmo tipo.
Sabendo disso, analise a função monádica e marque a alternativa que traz o correto
resultado dessa
execução:
Prelude Control.Monad > [10,50,60,100] >>= \x -> [x*x +x]

R: A. [110, 2550, 3660, 10100]


A mônada utilizando listas trabalha uma operação de multiplicação e soma, na qual o
resultado retornado será o produto da multiplicação de cada elemento por ele mesmo
somado ao
seu próprio valor primitivo. Exemplo: 10*10 = 100; 100 + 10 = 110
Isso acontecerá com todos os elementos da lista.

Você também pode gostar