Gleam에서는 다른 함수를 인자로 받는 함수, 즉 고차 함수를 작성하고 사용하는 일이 흔해요. 여러 고차 함수를 한꺼번에 사용하다 보면 들여쓰기 단계가 많아져서 코드를 읽기 어려워질 때가 있어요.
예를 들어, Result(Int, Nil) 타입을 반환하는 여러 함수를 호출하고, 네 함수가 모두 성공하면 그 값들을 더하는 함수가 여기 있어요.
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 표현식을 꺼내 쓰는 편이 좋아요.