ADR-20: 生成子は暦法純粋。カレンダー依存は後段に限る
判断: 生成子(monthEnd・everyDay・weekly など、時間ストリームを無から生む演算子)は
暦法(calendar-system)だけに依存し、カレンダー(営業日・祝日)には依存しない。カレンダーが関与するのは
後段の点変換(roll/shift)・フィルタ(営業日で間引く)以降に限る。
背景: 「@JP としたとき monthEnd は 2026-05-31 を含むか」という問いから確定した。monthEnd は
「月という窓の最終要素」であり、暦法 Gregorian の窓分割だけで決まる。その日が営業日かどうかは monthEnd の
関知するところではない。ゆえに monthEnd は常に 2026-05-31(暦日としての月末)を含み、TSE 等のカレンダーは
関与しない。「Gregorian+TSE 基準の monthEnd」という合成はカテゴリーエラーである。月の最終日は構造(暦法が
決める)、それが営業日かは方針(カレンダーが決める)で別層(ADR-03「曜日は構造、週末休は方針」の再来)。
もし生成子がカレンダー依存だったら、「月末」の意味が TSE か NYSE かで変わり、monthEnd という名前が premise で
ブレて ADR-17 の危険(同名が別物に解決される)を生む。それを避けるため生成子を暦法純粋に保つ。
却下した案: businessDays(on: TSE) のような、カレンダー依存の生成子を第一級に認める案。生成子の暦法純粋性を
破り、かつ生成+フィルタの畳み込み(ADR-06 の畳み込み禁止)に抵触するため却下。営業日の列は
everyDay |> filter(on: TSE)(生成子+後段フィルタ)で作る。
帰結:
- 「月末を営業日へ寄せる」は二段で表す。
monthEnd(5-31 を出す・暦法)→roll(Preceding, on: TSE)(5-29 へ寄せる・カレンダー)。この二段構造が roll 単品の存在意義の裏づけでもある(ADR-21)。 - 束ね名(
@JPに Gregorian+TSE+TZ を束ねる)において、各段は束ねの中から必要な成分だけを引く。monthEndは Gregorian だけを、roll/shiftは TSE だけを引く。全段が全成分を使うわけではない。 - 本判断は不変条件 I8 として明示される。