La capacidad de definir algo 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 los bucles, así que todos los bucles se hacen 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. En un tipo personalizado recursivo, una o más de sus variantes 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)