--- breaks: false tags: public-tech --- # Object で多相バリアントを返すメソッドを定義する この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の9日目です。 OCaml の object で多相バリアントを返すようなメソッドを 普通の関数と同じ感覚で定義しようとするとコンパイル時にエラーが出てうまくいきません。 ```ocaml= class foo = object method bar () = `A end;; Error: Some type variables are unbound in this type: class foo : object method bar : unit -> [> `A ] end The method bar has type unit -> ([> `A ] as 'a) where 'a is unbound ``` これは、多相バリアントを表す型が、暗黙的に型変数を持っているためです。 エラーを回避するためには、これを明示して多相メソッドを定義する必要があります。 ```ocaml= class foo = object method bar : 'a. unit -> ([> `A] as 'a) = fun () -> `A end;; ``` あるいは多相クラスにします。 ```ocaml= class ['a] foo = object method foo () = (`A : 'a) end;; ``` ## 参考 - [古瀬さんに教えていただきました](https://twitter.com/camloeba/status/1594507944640811008)。ありがとうございました。