私のモジュールのいくつかには、private_method
とpublic_method
という2つのメソッドを持つ特定のクラスタイプを実装するグローバルクラスインスタンスが含まれています。モジュールシグネチャ内のクラスインスタンス型の強制
MyModule.my_instance # public_method
は私のプログラムのどこからでも入手できますし、MyModule.my_instance # private_method
はMyModule
の中でのみ利用できるようにします。
私は次のことを試みた:
class type public_type = object
method public_method : int
end ;;
class type private_type = object
method public_method : int
method private_method : int
end ;;
let make_private : unit -> private_type = fun() -> object
method public_method = 0
method private_method = 0
end ;;
module type MY_MODULE = sig
val my_instance : public_type
end
module MyModule : MY_MODULE = struct
let my_instance = make_private()
let _ = print_int (my_instance # private_method)
end
しかし、これはエラーになります:
Values do not match:
val my_instance : private_type
is not included in
val my_instance : public_type
私はは手動で強制を書くことができます:
module MyModule : MY_MODULE = struct
let my_instance = make_private()
let _ = print_int (my_instance # private_method)
let my_instance = (my_instance :> public_type)
end
しかし、私をむしろ単純なものとしてコードサイズを倍にしないでくださいこれ
なぜこのようなことが起こり、どのように対処できるかについてご意見はありますか?
これは、明示的なオブジェクト型の式で使用することができます... –
manual(6.11.1)は、 '式(module-expr:module-type)はmodule-exprの型がmodule-typeのサブタイプであることをチェックしますが'私はそれが期待される行動だと思います。 IIRC 3.12ではモジュールを ':>'と強制することは可能です – ygrek
私は恐れています3.12少なくとも変更ログには記載されていませんが、これは不可能です。しかし、**これはなぜ実装されなかったのですか?**彼らがこれをした場合、または彼らがそれについて考えるのではないとタイプシステムに実際の問題がありますか? –