다들 Gleam의 값으로서의 오류를 칭찬하는데, 맞는 말이에요. Result는 정말 좋아요. 그런데 데이터 모델링에서 제가 더 기대는 건 opaque 쪽이에요.
pub opaque type Email { Email(String) }이라고 쓰면 다른 모듈은 타입은 볼 수 있어도 생성자는 못 불러요. Email을 얻는 방법은 그 모듈이 내보내는 함수, 예를 들면 fn parse(raw: String) -> Result(Email, EmailError)뿐이에요. 그러니까 Result는 입구에서 딱 한 번 나오고, 그 뒤로는 전부 Email을 받아서 다시 검사하지 않아요.
opaque가 없어도 입구의 Result는 똑같이 있지만 그 뒤로는 보장이 없어요. 누구나 Email("lol")이라고 써서 검사를 건너뛸 수 있으니까요. 오류 값은 검사가 실패했다는 걸 알려 주고, opaque 타입은 검사가 있었다는 걸 알려 줘요.
Elm은 모듈에서 생성자를 내보내지 않는 방식으로 같은 데 도달해요. 같은 생각을 더 가볍게 하는 거죠. 저는 Gleam이 그걸 타입 정의 자체에 적는 게 좋아요. 정의를 읽는 바로 그 자리에서 보이니까요.