openlang

판별 유니온은 응답 검사가 끝난 뒤부터 시작해요

부분 검토

외부 응답은 바이트로 들어와요. 그때는 애플리케이션이 특정 변형이라고 부를 근거가 아직 없어요. 가상의 클라이언트에서는 먼저 텍스트 디코딩과 JSON 파싱을 하고, 각각의 실패 경로를 처리해요. 파싱한 값은 그다음 검증 단계에 unknown으로 들어가야 해요.

지원하는 응답이 문자열 배열 items를 갖는 ready 태그이거나, 문자열 message를 갖는 failed 태그라고 해 봐요. 런타임 검사는 값이 객체인지, 태그가 알려진 것인지, 해당 페이로드가 필요한 모양인지를 확인해야 해요. ready는 있지만 items가 없는 객체는 불완전해요. waiting이 있는 객체의 태그는 이 계약 밖에 있어요. 타입 단언으로 원하는 유니온의 이름을 붙여도 어느 쪽도 유효해지지 않아요.

검사가 성공한 뒤에는 디코더가 판별 유니온을 반환할 수 있어요. 그러면 ready인지 검사하는 분기에서 값의 타입이 좁혀져 애플리케이션이 항목을 사용할 수 있어요. never를 이용한 완전성 검사는 선언한 모델에서 처리하지 않은 변형을 드러내는 데 도움이 돼요. 유지보수에는 유용하지만 응답 바이트를 검사하는 작업은 아니에요.

거부한 입력을 다룰 정책도 필요해요. 디코딩 실패를 알릴 수도 있고, 알 수 없는 응답을 의도적으로 별도 변형으로 모델링할 수도 있어요. 조용히 허용된 유니온으로 캐스팅하면 그 결정을 건너뛰게 돼요. 런타임 근거는 타입이 붙은 값을 만드는 곳 가까이에 두고, 각 처리기의 계산은 따로 검토하겠어요. 분기를 빠짐없이 다뤘다고 그 분기가 올바른 답을 낸다는 뜻은 아니에요.

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    입력 검사와 대안 표현을 구분한 논의에는 Haskell에서 또 다른 한계가 있습니다. 가상의 Either 결과는 디코딩 오류와 받아들인 데이터를 구분해도 평가의 종료를 증명하지는 않습니다. Right undefined를 매칭해 단지 True를 반환한다면 페이로드를 요구하지 않을 수 있습니다. 그 페이로드의 길이를 요청하면 평가가 필요해지고 실패한 평가를 만나게 됩니다. let loop = loop in loop 같은 식은 어느 생성자에도 도달하지 않을 수 있습니다. 대안은 가능한 모양을 나타내며, 모든 입력에서 정상 결과를 낸다고 보장하지는 않습니다.

  2. 고유 링크

    그 서비스가 나중에 Deferred(ticket)을 도입한다고 해 봐요. 닫힌 Scala 3 enum은 이 경우에 고유한 데이터를 줄 수 있지만, 받아들이려면 디코더와 화면 표시, 영속화 같은 소비 지점을 검토해야 해요. 하나의 모델이 대안들을 관리한다면 그 조율은 유용해요. 독립적인 생산자가 중앙 정의를 바꾸지 않고 변형을 추가해야 한다면 닫힌 집합은 비용이 돼요. 중앙에서 얻는 완전성은 줄더라도, 열린 인터페이스나 명시적으로 검증한 미지의 응답 봉투가 더 잘 맞을 수 있어요.