Programação Funcional
Valores (constantes)
nome = "potigol"
Listas
lista1 = [1,2,3,4]
lista2 = 0::lista1
numeros = [1, 2, 3, 4, 5, 6, 7, 8]
pares = numeros.selecione(n => n mod 2 == 0) # filtro
soma = numeros.injete(0)((a,b) => a + b) # fold
dobro = numeros.mapeie(n => n * 2) # map
Expressões lambda
x = (a: Inteiro) => a * 2
escreva x(4)
"list comprehension"
y = para i de 1 até 10,
j de i + 1 até 10 gere
i+j
fim
escreva y
Funções de Alta ordem
f(g: Inteiro => Inteiro, a: Inteiro) = g(a)
sucessor(n: Inteiro) = n + 1
escreva f(sucessor, 5)
Currying
soma(a: Inteiro) = ((b: Inteiro) => a + b)
escreva soma(2)(3)
suc = soma(1)
escreva suc(4)
Recursão em cauda otimizada
h(a, cont: Inteiro): Inteiro = escolha a
caso 0 => cont
caso n => h(a-1, cont+1)
fim
escreva h(1000,0)
Casamento de Padrões
# QuickSort
quicksort(num: Lista[Inteiro]): Lista[Inteiro] =
escolha num
caso [] => []
caso pivo::resto =>
menores = resto.selecione( _ <= pivo )
maiores = resto.selecione( _ > pivo )
quicksort(menores) + pivo::quicksort(maiores)
fim
escreva "Digite alguns números separados por espaços"
numeros = leia_inteiros(" ")
escreva "Os números ordenados:"
escreva quicksort(numeros)