매달 파트너는 가장 친한 친구와 만나요. 둘 다 일정이 아주 바빠서 적당한 날짜를 잡기가 쉽지 않죠! 파트너는 나도 일정이 바쁜 걸 알기 때문에, 만날 만한 날짜를 항상 나와 다시 확인해요:
이번 달 통화에서 파트너가 이렇게 물었어요:
어리둥절해진 나는 "teenth" 날이 뭔지 물어봐요. 파트너는 스스로 만들어 낸 개념인 teenth 날은 한 달 중 '-teenth'로 끝나는 날을 가리킨다고 설명해요:
요일도 일곱 개이기 때문에, 각 요일마다 매달 정확히 하나씩 teenth 날이 있다는 게 보장돼요.
이제 teenth 날의 개념을 이해했으니, 달력을 확인해요. teenth 목요일에는 아무 일정도 없어서, 기쁜 마음으로 파트너와 날짜를 확정해요.
월, 연도, 요일, 주가 주어지면 모임의 정확한 날짜를 찾아야 해요.
고려할 주를 나타내는 값은 first, second, third, fourth, last, teenth 여섯 가지예요.
예를 들어, 2018년 1월의 첫 번째 월요일에 열리는 모임의 날짜를 찾으라는 문제가 나올 수 있어요 (2018년 1월 1일).
마찬가지로, 다음을 찾으라는 문제가 나올 수도 있어요:
틴스 주는 한 달 중 '-teenth'로 끝나는 7일을 가리켜요 (13th, 14th, 15th, 16th, 17th, 18th, 19th).
1953년 8월의 틴스 주 토요일을 찾으라고 하면, 그 달의 달력을 확인해 봐요:
August 1953
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
이로부터 틴스 주 토요일이 1953년 8월 15일이라는 것을 알 수 있어요.
이 연습 문제에서는 1부터 12까지의 자연수를 나타내는 Month라는 서브타입을 정의해요.
서브타입은 쌍 ⟨x, h⟩로 생각할 수 있는데, 여기서 x는 값이고 h는 그 값이 유효하다는 증명이에요.
서브타입 안의 값(여기서는 x)은 .val을 사용해 접근할 수 있어요. 예를 들어 x.val처럼요.
증명은 .property를 사용해 접근할 수 있어요. 예를 들어 x.property처럼요.
둘 다 평소처럼 패턴 매칭으로도 접근할 수 있어요.