A capacidade de algo se definir em termos de si próprio chama-se recursão. Em Gleam, a recursão aparece mais frequentemente nas funções recursivas, que são funções que se chamam a si próprias.
Uma função recursiva tem de ter pelo menos um caso base e pelo menos um caso recursivo. Um caso base devolve um valor sem voltar a chamar a função. Um caso recursivo volta a chamar a função, modificando o valor de entrada para que, em algum momento, corresponda ao caso base.
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
O Gleam não tem sintaxe especial para fazer ciclos, por isso todos os ciclos são feitos com recursão.
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
O Gleam também suporta tipos personalizados recursivos. Um tipo personalizado recursivo tem uma ou mais variantes que se referem a si próprias nos dados que contêm.
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)