9

文字列をキーとしてハッシュテーブルを識別し、整数値にマップできるタイプ (my_type など) を定義できるようにしたいと考えています。
だから、私は試しました

# type my_type = (string, int) Hashtbl.t;;

でも、やってみると

# let a = Hashtbl.create 100;;
val a : ('_a, '_b) Hashtbl.t = <abstr>
# Hashtbl.add a "A" 12;;
- : unit = ()
# a;;
- : (string, int) Hashtbl.t = <abstr>

最後の行は、my_type の代わりに (string, int) Hashtbl.t = abstr を示しています。ハッシュテーブルのタイプが my_type であることを確認するにはどうすればよいですか?

4

3 に答える 3

9

型シノニムを宣言し、コンパイラーが正確な状況でいずれかの式を使用することを期待することは意味がありません: それらは等しい型であるため、コンパイラーはどちらか一方を使用し、それをほとんど制御できません。

型の抽象化を強制して型my_typeを他の型と混在させたくない場合(string, int) Hashtbl.tは、違いを示すコンストラクターを使用して新しい型を定義する必要があります。

type my_type = Tbl of (string, int) Hashtbl.t
let a = Tbl (Hashtbl.create 100)
let add (Tbl t) k v = Hashtbl.add t k v

my_typeこれが必要な場合があります (関数の 1 つを使用する場合は、明示的なパターン マッチングによってすべての値をハッシュ テーブルに変換するコストを支払う必要がありHashtblます)。または、型シノニムのみを操作したい場合もありますが、後者の場合はコンパイラの出力が特定の型を報告するとは思わないでください。

于 2013-03-10T15:05:51.383 に答える
2

更新:申し訳ありませんが、gascheが指摘しているように、単純な型注釈を使用してそれを行うことができます。型強制は忘れてください

# type my_type = (string, int) Hashtbl.t;;
type my_type = (string, int) Hashtbl.t
# let (a : my_type) = Hashtbl.create 100;;
val a : my_type = <abstr>
于 2013-03-10T14:37:15.833 に答える
1

my_typeは単に の同義語で(string, int) Hashtbl.tあり、両方を同じ意味で使用できます。

a次のように、タイプが であることをコンパイラに伝え、my_typeより適切な出力を得ることができます。

# let (a:my_type) = Hashtbl.create 100;;
val a : my_type = <abstr>
# a;;
- : my_type = <abstr>

について疑問に思っている場合は<abstr>、トップレベルが印刷方法を認識していないことを意味しますa(そのタイプではなく、その内容)。

于 2013-03-10T13:57:39.307 に答える