---
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)。ありがとうございました。