Exercício destacado 1 - Defina uma função htmlItem :: String -> String
que receba uma String
e adicione tags <li>
e </li>
como prefixo e sufixo, respectivamente. Por exemplo, se a entrada for "abc", a saída será "<li>
abc</li>
". Use o operador ++ para concatenar strings (este operador serve para concatenar quaisquer listas do mesmo tipo).
Exercício destacado 2 - Defina uma função isElderly :: Int -> Bool
que receba uma idade e resulte verdadeiro caso a idade seja maior que 65 anos.
Exercício destacado 3 - Crie uma função countSpaces que receba uma string e retorne o número de espaços nela contidos. Dica 1: você vai precisar de uma função que identifica espaços. Dica 2: aplique funções consecutivamente, isto é, use o resultado de uma função como argumento para outra.
Definição: funções que podem ou receber outras funções como parâmetro ou retornar. Em Haskell (além das funções map
e filter
apresentadas em aula), existem funções prontas muito relevantes e de uso corriqueiro em aplicações, sendo importante ao manipular listas. As funções são chamadas e deixadas em uma pilha, sempre guardando os valores dos argumentos, os endereços de retorno e variáveis locais, tal qual uma função dita "normal".
Exemplos:
all()
: recebe como parâmetros uma função que retorna um booleano e uma lista e retorna um booleanoTrue
caso todos os elementos da lista obedeçam ao primeiro parâmetro eFalse
caso contrário;any()
: semelhante aoall()
, mas retornaTrue
caso pelo menos um dos elementos corresponda à função passada como parâmetro;takeWhile()
: também recebe uma função e uma lista como parâmetros, mas dessa vez, a função criará uma nova lista, usando apenas os elementos que obedecerem ao parâmetro;dropWhile()
: o oposto da anterior, removerá os elementos que obedecem ao parâmetro.
*Exemplos para cada uma das funções podem ser encontrados na bibliografia.
Em C, apesar de ser uma funcionalidade não muito usual, é possível utilziar funções de alta ordem, passando o endereço das funções passadas como parâmetro ou retorno.
Assim como Haskell ou Python, R também possui funções de alta ordem, aqui vou destacar algumas, que fazem parte do grupo apply:
apply()
: recebe um DataFrame, uma matriz ou um array multi-dimensional, uma margem e uma função. A margem diz se a função será aplicada nas linhas ou nas colunas daquela base de dados recebida, com 1 sendo para linhas e 2 para colunas, e posso passar comoc(1,2)
que irá concatenar e passar os dois valores juntos.lapply()
: recebe assim como oapply()
e listas, e uma função, após aplicará a função em cada elemento recebido, e retornará uma lista;sapply()
: semelhante ao anterior, mas tenta "simplificar" o retorno, sempre tentando converter para vetor -> matriz -> lista, caso o anterior não dê certo;vapply()
: recebe um tipo de dado citado anteriormente, uma função que será aplicada nos elementos e o tipo de dado que será retornado.
As funções lambda são criadas com uma palavra-chave (ou símbolo, depende da linguagem), argumentos e uma expressão (código executado quando a mesma for chamada). Esse recurso serve para quando o programador quer criar uma função curta, que será utilizada pontualmente, mas não quer declará-la. Elas seguem o mesmo padrão de execução de instruções de uma função normal.
Exemplo em R:
quadrado <- function(x){
res = x ^ 2
return(res)
}
sapply(1:5, quadrado)
A função "quadrado" é uma funcão que recebe um número e retorna o seu quadrado, contudo, ela é muito simples, e pode ser substituída por uma versão inline, caso seu uso não seja repetitivo.
sapply(1:5, function(x) x^2)
Exemplo de função lambda em Python:
list(map(lambda x: x * x, numeros))
https://haskell.pesquisa.ufabc.edu.br/haskell/06.higher.order/
https://en.cppreference.com/w/c/language/pointer.html
https://lente.dev/posts/lambda/
https://www.dataquest.io/blog/apply-functions-in-r-sapply-lapply-tapply/