何かをそれ自身を用いて定義できることを、再帰といいます。Gleamでは、再帰は再帰関数でよく見られます。再帰関数とは、自分自身を呼び出す関数のことです。
再帰関数には、少なくとも1つの_基底ケース_と、少なくとも1つの_再帰ケース_が必要です。_基底ケース_は、関数を再び呼び出さずに値を返します。_再帰ケース_は、入力に変更を加えながら関数を再び呼び出し、いずれ基底ケースに一致するようにします。
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は再帰的なカスタム型もサポートしています。再帰的なカスタム型では、そのバリアントのうち1つ以上が、含んでいるデータの中で自分自身を参照します。
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)