OCaml:タイプチェックオブジェクト
-
07-07-2019 - |
質問
オブジェクトがある場合、そのタイプを判別するにはどうすればよいですか? (Javaの instanceof
演算子に相当するOCamlはありますか?)
解決
OCamlには、Javaのような主格型ではなく、オブジェクトの構造型があります。そのため、オブジェクトのタイプは基本的にそのメソッドによって決定されます(そして唯一決定されます)。 OCamlのオブジェクトは、クラスなどを経由せずに直接作成できます。
引数オブジェクトに特定のメソッドがある(およびそれらのメソッドに特定のタイプがある)ことを要求する関数を作成できます。たとえば、次のメソッドは、メソッド" bar"を持つオブジェクトである引数を取ります:
let foo x = x#bar
他のヒント
" Matching Objects With Patterns" についての議論があります Lambda the Ultimate (この論文では言語としてScalaを使用しているため、質問)。より関連性の高い Ocamlメーリングリストスレッドは、オブジェクトにRTTI / safe-downcastingがないことを示します。
代数(非オブジェクト)型の場合、明らかに次のようになります。
match expr with
Type1 x -> x
Type2 (x,y) -> y
誰かが拡張子 Ocamlオブジェクトのダウン/アップキャストを許可します。
要するに、独自のRTTIメカニズムをエンコードする必要があります。 OCamlはRTTIまたはup / downキャストを提供しません(継承とサブタイプはJavaのように統一されるのではなくOCamlで直交するため、後者)。
文字列またはポリモーフィックなバリアントを使用して、クラスおよびオブジェクトの型情報をエンコードすることができます。 LablGTKはこれの一部を実行し、オブジェクトのタグ付けとアップ/ダウンキャストをサポートするユーティリティライブラリを提供すると思います。
やや話題外ですが、 OPA言語(OCamlのいくつかの側面から大きく引き出されています) 、オブジェクトのパターンマッチングに相当します。だからそれはかなり実現可能です。