Skip to content

Instantly share code, notes, and snippets.

@coproduto
Last active April 16, 2024 20:20
Show Gist options
  • Save coproduto/936b2a2ef2c974957b4f2cf43c1aa3bd to your computer and use it in GitHub Desktop.
Save coproduto/936b2a2ef2c974957b4f2cf43c1aa3bd to your computer and use it in GitHub Desktop.
-- Imagina que a gente não tivesse recursão. Isso significaria essencialmente que uma expressão não pode se referir ao nome
-- dela mesma dentro da definição dela. Por exemplo, a definição de fatorial abaixo não poderia existir:
factorialRec n = n * factorialRec (n - 1)
-- Como o nome factorialRec é citado na função e estamos proibindo citar o nome da própria função, esse termo se torna
-- ilegal. Então como poderíamos escrever a função fatorial? Bom, uma ideia é trocar a chamada recursiva por um argumento:
factorialOpen f n = n * f (n - 1)
-- agora a gente tem um fatorial "aberto" - se a gente conseguir passar o fatorial "fechado" pra ele, o resultado dele
-- vai ser o fatorial "fechado". Ou seja, o *ponto fixo* da função factorialOpen é a função factorialRec
-- (um ponto fixo é um argumento de uma função tal que a função retorna o valor do argumento). Como a gente pode
-- se referir ao fatorial "fechado"? Bom, a gente precisaria de uma função que:
-- 1. Recebe uma função de 1 argumento
-- 2. Passa o ponto fixo dessa função para ela
-- 3. Retorna o valor resultante
-- Ou seja:
fix f = f (fix f)
-- E agora podemos definir:
factorialY = fix factorialOpen
-- E o comportamento de factorialY é igual ao de factorialRec.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment