La capacidad de algo para definirse en términos de sí mismo se llama recursión. En Gleam, la recursión se encuentra con mayor frecuencia en las funciones recursivas, que son funciones que se llaman a sí mismas.
Una función recursiva necesita tener al menos un caso base y al menos un caso recursivo. Un caso base devuelve un valor sin volver a llamar a la función. Un caso recursivo vuelve a llamar a la función, modificando la entrada para que en algún momento coincida con el caso base.
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
Gleam no tiene una sintaxis especial para hacer bucles, así que todos los bucles se implementan con recursión.
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
Gleam también admite tipos personalizados recursivos. Un tipo personalizado recursivo tiene una o más de sus variantes que se refieren a sí mismas en los datos que contienen.
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)