توانایی تعریف شدن یک چیز بر پایهی خودش را «بازگشت» مینامند. در Gleam، بازگشت بیشتر در توابع بازگشتی دیده میشود؛ توابعی که خودشان را فراخوانی میکنند.
یک تابع بازگشتی باید دستکم یک حالت پایه و دستکم یک حالت بازگشتی داشته باشد. حالت پایه بدون فراخوانی دوبارهی تابع، یک مقدار برمیگرداند. حالت بازگشتی تابع را دوباره فراخوانی میکند و ورودی را طوری تغییر میدهد که در نقطهای با حالت پایه مطابقت کند.
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
Gleam نحوهی نگارش ویژهای برای ساختن حلقه ندارد؛ به همین دلیل همهی حلقهها با بازگشت ساخته میشوند.
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
Gleam از انواع سفارشی بازگشتی هم پشتیبانی میکند. در یک نوع سفارشی بازگشتی، یک یا چند گونه در دادهای که در خود جای دادهاند به خود آن نوع ارجاع میدهند.
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)