1

これはOCamlの表記法に関する質問です。

機能をテストしようとしています

let rec add (x : 'a) (l : 'a set) : bool =
begin match l with
| [] -> []
| hd :: rest -> if x = hd then rest else (hd :: (add x rest))
end

私のテストケースは

let test () : bool =
add (3 [1; 2; 4]) = [1; 2; 3; 4]
;; run_test "add 3 [1; 2; 4]" test

「この式は関数ではないため、適用できません」というエラーが表示されます

私の表記に何か問題がありますか?

4

2 に答える 2

3

OCamlには組み込みのsetタイプがありません(代わりにSetモジュールまたはライブラリがあります)。そのため、定数を設定するための組み込みの表記法もありません。

小さめのセットの場合、リストを使用することがよくあります。そして、実際にList.memは、(セットではなく)リストを操作する関数です。リストの表記は次のようになります[1; 2; 3; 4]

(補足として、という名前の関数addは何も追加しません。しかし、まだ始めたばかりかもしれません。)

于 2013-02-04T03:34:49.947 に答える
2

OCamlには集合の内包的記法はありません。あなたの'a setタイプが何であるかわかりません。メンバーシップがテストされる理由がわかりませんList.memが、特定の表記法はありません。

標準ライブラリにはSet.Makeファンクターがあり、少なくともタイプとキーの比較関数を持つモジュールによってインスタンス化されます(ここを参照)。

module StringSet = Set.Make(String)
let set = StringSet.(add 0 (add 1 (add 2 empty)))
let test = StringSet.mem 3 set

便利な表記法が必要な場合は、リストからセットへの変換関数を使用し、リスト表記法を使用するのが最善の策です。

let set_of_list li = List.fold_left (fun s v -> StringSet.add v s) StringSet.empty li
let set = set_of_list [0; 1; 2]
于 2013-02-04T03:40:36.393 に答える