2026年8月8日(土)掲載 3,372本日 29
HN494

OCamlのGuarded Methodsとは?2025年版最新解説

Guarded Methods in OCaml (2025)

birdculture5日前

議論

4
1msdz約7時間前

いい記事だけど、なぜ筆者がここまで静的関数を毛嫌いするのかいまいち納得できないな。

さらに、インスタンスにメッセージを送るという体系的なアプローチ(オブジェクト指向プログラミングを支持する主な論拠の一つとしてよく挙げられる)を壊すことになる。

これって単に「クラスやメソッド、実装が増えすぎるとコードがスパゲッティ化する」っていう話なの?それとも逆に、型を制約した非静的メソッド(あるいはメソッドをクラスの外に出す手法)の方が、かえって混乱を招くのでは?

2spankalee約6時間前

今日これが話題になってて面白いね。

今新しい言語を自作してるんだけど、ちょうど数日前に等価性のセマンティクスをSwiftっぽく厳密にしようとしてた時に、ガードメソッドの概念が出てきたんだ。

Array.contains()みたいに、要素型がEquatableインターフェースを実装している場合のみ機能するようなやつ。例えばこんな感じ:

    class Array<T> {
      contains(value: T): boolean where T extends Equatable { ... }
    }

あるいは、TypeScript風にthis型を制約するとか:

    class Array<T> {
      contains(this: Array<T extends Equatable>, value: T): boolean { ... }
    }

https://github.com/elematic/zena/blob/8d77f2b36001078f4d50540f6243d52f570f13b6/docs/design/equality.md#d4--conditional-api-via-member-level-where-bounds

3wavemode約6時間前

ガードメソッドは必要そうだけど、残念ながらそれを定義できる主要な言語を知らない。

C++ならこの機能があるよ。テンプレートクラスを定義する時にSFINAE(現代のC++ならコンセプト)を使えば、テンプレート引数が特定の要件を満たした時だけメソッドを存在させることができるんだ。

(もっとも、これは必ずしも必要ないケースが多い。例えば「flatten」の例なら、制限なしで定義しても問題ないし。テンプレートクラスのメソッドは遅延して型チェックされるから、呼び出されない限り型チェックを通す必要がないんだ。この特定のユースケースでSFINAEやコンセプトを使うのは、エラーメッセージを分かりやすくするためってくらいかな)

Rustにも条件付き実装(conditional impls)という形でこの機能があるよ。