OCamlを使ってデータセットを生成し、それを比較したいと思う。 Set.OrderType
,Set.Make
などのモジュールタイプのドキュメントを見ましたが、セットを初期化する方法や他の方法を使用する方法がわかりません。OCaml:モジュールを設定する
16
A
答えて
28
セットは、ファンクショナルインターフェイスを使用して定義されます。任意のタイプについては、Set.Make
ファンクタを使用して、そのタイプのSet
モジュールを作成する必要があります。標準ライブラリの不幸な監督は、組み込み型のインスタンスをSet
定義していないことです。ほとんどの場合、Pervasives.compare
を使用すれば十分です。ここでint
のために働くの定義です:
module IntSet = Set.Make(
struct
let compare = Pervasives.compare
type t = int
end)
モジュールIntSet
はSet.S
インタフェースを実装します。今、あなたはIntSet
モジュール使用してセットを操作することができます:あなたが明示的にOrderedType
としてSet.Make
の入力構造を定義する必要はありません
let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;
注意を。型推論はあなたのために仕事をします。あなたはファンクタを使用して、いくつかの一般性を失うので、
module IntMap = Map.Make(IntOrder)
:
module IntOrder : Set.OrderedType = struct
type t = int
let compare = Pervasives.compare
end
module IntSet = Set.Make(IntOrder)
これは、あなたがMap
をインスタンス化するために同じモジュールを再利用できるという利点があります。また、あなたは、次の定義を使用することができます要素の型は固定されています。たとえば、任意のタイプのSet
を取り、その上で何らかの操作を実行する関数を定義することはできません。 (Set
モジュールはSet
で多くの便利な操作を宣言しています)
9
クリスの答えに加えて、いくつかの標準ライブラリモジュールはすでにOrderedType
の署名に準拠していると言えるでしょう。たとえば、次のようにします。
module StringSet = Set.Make(String) ;; (* sets of strings *)
module Int64Set = Set.Make(Int64) ;; (* sets of int64s *)
module StringSetSet = Set.Make(StringSet) ;; (* sets of sets of strings *)
などです。
次に、StringSet
の簡単な使用例を示します。セットが機能的なデータ構造であることに注意してください。新しいエレメントをセットに追加すると、新しいセットが返されます。
let set = List.fold_right StringSet.add ["foo";"bar";"baz"] StringSet.empty ;;
StringSet.mem "bar" set ;; (* returns true *)
StringSet.mem "zzz" set ;; (* returns false *)
関連する問題
- 1. モジュールを使用するOcamlを設定する
- 2. OCamlで行列モジュールを定義する
- 3. OCaml - シグネチャ、モジュール、タイプ
- 4. Ocamlの2つのインタラクティブなモジュールを設計する
- 5. OCamlのモジュールとパフォーマンス
- 6. OCaml - モジュールのインターフェイスを見る方法?
- 7. Account_assetモジュールの設定
- 8. Drupalモジュールの重量を設定する
- 9. OCaml:バリアント型とモジュール定義の間の循環性
- 10. PowerShellモジュールのプロパティを設定
- 11. OCamlでのモジュール動作の変更
- 12. OCamlの現在のモジュールへの参照
- 13. ocamlモジュールと同じファイルのプログラム
- 14. ocamlで新しいモジュールをインポートして使用するには?
- 15. OCaml utopでいくつかのモジュールを使用する
- 16. 他のモジュールからsymfonyモジュール設定にアクセスする
- 17. モジュール式django設定ファイルImportError
- 18. PRISMモジュールapp.config構成設定
- 19. condense c#dnnモジュール設定コード
- 20. ZendFrameworkでのモジュールの設定
- 21. Magento - モジュール設定ファイル内の設定値を使用
- 22. 設定がRequireJSで設定されている場合、RequireJSを使用してモジュールを設定する
- 23. EmacsでOcamlの注釈を生成して設定する方法は?
- 24. 問題設定モジュール固有の設定ファイル
- 25. OCamlで互いにリンクしている2つのモジュールを定義するには?
- 26. OCamlモジュール:包含して開きますか?
- 27. OCamlのHttpRequestに最適なモジュールは何ですか
- 28. OCaml Optionモジュールはどこにありますか?
- 29. OCamlユーザ定義タイプのソートリスト
- 30. OCamlのユーザ定義プリンタ
"任意のタイプのセットを取る関数を定義することはできません"ただし、特定のSetモジュールをパラメータとするファンクタ内で関数を定義することで、同じことを達成できます。プログラマがこのファンクタを使用して別のモジュールを作成しなければならないので、あまり便利ではありません。 – newacct
それは、ファンクターのすべての方法です。 –