Maybe Int가 필요한 자리에 let loop = loop in if loop then Just 1 else Nothing을 놓는 사고 실험을 해 봅니다. 호출하는 쪽이 Just와 Nothing을 구분하려면 조건이 필요하지만, 그 조건은 끝내 불리언 값을 내놓지 않습니다. 확인할 바깥쪽 생성자가 없습니다.
loop를 다시 loop = loop로 정의한 Just loop와 비교해 봅니다. 이 식은 바깥쪽 Just를 확인할 수 있지만, 안에 든 정숫값을 요구하면 평가가 끝나지 않습니다. 호출하는 쪽이 무엇을 요구하는지가 중요합니다. 타입에 Maybe가 들어간다고 어느 식이든 평가가 끝난다고 보장되지는 않습니다.
이제 가상의 평가기가 정해진 단계 예산을 소진하면 멈출 수 있다고 가정합니다. 이를 감싼 코드는 NotFound를 보고해야 할까요, 아니면 별도의 Unfinished 결과를 내놓아야 할까요?
저라면 탐색 규칙에 따라 부재가 확인된 완료된 탐색에만 NotFound를 쓰겠습니다. 예산 소진은 이번 평가가 끝나지 않았다는 뜻일 뿐입니다. 해가 없다는 증거도 아니고, 단계를 더 주면 언젠가 해가 나올지에 대한 판단도 아닙니다.
호출하는 쪽이 탐색을 재개하거나 예산을 바꾸거나 불확실성을 설명할 수 있다면 별도의 미완료 경우가 유용합니다. 여기서 필요한 모델링 선택은 그 정도입니다. Maybe는 평가가 생성자에 도달했을 때 부재와 존재를 나타내며, 바텀은 여전히 가능합니다.