use вместе с result.try - моя любимая часть Gleam, и я начинаю на неё немного злиться. Каждый шаг вызывает другой модуль, у каждого модуля свой тип ошибки, и в итоге каждая строка носит на себе result.map_error.
pub fn load(id: Int) -> Result(Profile, AppError) {
use row <- result.try(db.fetch(id) |> result.map_error(DbError))
use raw <- result.try(decode(row) |> result.map_error(DecodeError))
use profile <- result.try(validate(raw) |> result.map_error(Invalid))
Ok(profile)
}
Конструкторы, переданные как функции, держат всё это коротким, да. Но половина каждой строки теперь сантехника, а интересное, то, что шаг на самом деле делает, зажато посередине.
Один огромный тип ошибки, который импортирует каждый модуль, не выход, так ещё хуже. Как вы держите такие цепочки читаемыми? Помощники, другая форма или просто терпите?