القدرة على تعريف شيء ما بدلالة نفسه تُسمّى العودية. وفي 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)