Base da programação funcional
- Como é implementado?
Todos as funções construídas na aula anterior
Definição
Uma função que recebe outra função
Permite aplicar uma função aos elementos de um vetor
- Retorna um vetor
sapply(1:3, function(x) x^2)
[1] 1 4 9
Permite aplicar uma função para todos os elementos de uma lista
- Retorna uma lista com os retornos (na ordem)
lapply(1:3, function(x) x^2)
[[1]] [1] 1 [[2]] [1] 4 [[3]] [1] 9
Utilizado quando não se sabe a aridade
de uma função
f <- function(x, ...)
{
dots <- list(...)
if(length(dots) == 0) return(NULL)
cat("The arguments in ... are\n")
print(unlist(dots))
f(...)
}
f(1,2,3,"a", list("monkey"))
The arguments in ... are [1] "2" "3" "a" "monkey" The arguments in ... are [1] "3" "a" "monkey" The arguments in ... are [1] "a" "monkey" The arguments in ... are [1] "monkey" NULL
soma <- function(l) {
if (length(l) == 0) return(0);
h <- head(l, n = 1)[[1]];
t <- tail(l, n = length(l)-1);
return(h+soma(t));
}
soma(c(1, 2, 3, 4, 5));
O código abaixo, similar a estrutura do de cima, não funciona. Por quê?
soma <- function(...) {
l <- list(...)
if(length(l) == 0) return(0)
h <- head(l, n = 1)[[1]];
t <- tail(l, n = length(l)-1);
return(h+soma(t));
}
soma(1, 2, 3, 4, 5);
Permite compor funções.
library(functional);
cabeca <- function(lista) lista[[1]];
resto <- function(lista) lista[2:length(lista)];
l <- c(1,2,3,4);
cabeca_do_resto <- Compose(resto, cabeca)
cabeca_do_resto(l);
Moses Schönfinkel (matemático russo)
- Também inventor da notação de lógica combinatória
- Propôs um método de transformação de funções
Currying
Transforma uma função com múltiplos argumentos em uma cadeia de funções, cada uma com um único argumento
Normak, 2007, escreve:
"... ela nos permite visualizar a função como se ela
pegasse no máximo um único parâmetro. Currying pode
ser visto como uma maneira de gerar funções
intermediárias que aceitam parâmetros adicionais
para completar um cálculo."
library(functional)
mult <- function(a, b)
{
return(a*b);
}
dobra <- Curry(mult, a=2)
tripla <- Curry(mult, a=3)
dobra(10)
tripla(10)
[1] 20 [1] 30