Gleamでは、高階関数、つまり他の関数を引数として受け取る関数を書いたり使ったりするのが一般的です。たくさんの高階関数を一度に使うと、インデントが何層にも重なり、コードが読みにくくなることがあります。
たとえば、Result(Int, Nil)を返すいくつかの関数を呼び出し、4つすべてが成功したときにその値を合計する関数を考えてみましょう。
import gleam/result
pub fn main() -> Result(Int, Nil) {
result.try(function1(), fn(a) {
result.try(function2(), fn(b) {
result.try(function3(), fn(c) {
result.try(function4(), fn(d) {
Ok(a + b + c + d)
})
})
})
})
}
Gleamのuse式を使えば、このコードをインデントなしで書くことができ、多くの場合より読みやすくなります。
import gleam/result
pub fn main() -> Result(Int, Nil) {
use a <- result.try(function1())
use b <- result.try(function2())
use c <- result.try(function3())
use d <- result.try(function4())
Ok(a + b + c + d)
}
use式は、ブロック内の後続の文をすべてまとめて、コールバック関数として関数呼び出しの最後の引数に渡します。useキーワードと<-の間にある変数は、コールバック関数に渡される引数の名前です。
// This use expression
use a <- function(1, 2)
io.println("Hello!")
a
// Is equivalent to this normal function call
function(1, 2, fn(a) {
io.println("Hello!")
a
})
コールバック関数は、いくつでも引数を受け取ることができ、まったく受け取らないこともできます。
use a, b, c, d <- call_4_function()
use <- call_0_function()
use式で呼び出せる関数を作るために特別な条件はありません。最後の引数としてコールバック関数を受け取ることだけです。
pub fn call_twice(function: fn() -> t) -> #(t, t) {
let first = function()
let second = function()
#(first, second)
}
Gleamのuse式は非常に強力な機能で、さまざまな問題に応用できますが、使いすぎるとコードが読みにくくなることがあります。ふつうは通常の関数呼び出しの構文を使い、コードが読みやすくなるときにだけuse式に頼るのがよいでしょう。