2013-02-04 55 views
1

這只是關於OCaml的符號的問題。設置符號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 

我得到一個「這種表達是不是一個函數,不能適用」錯誤

我的符號有問題嗎?

+2

錯誤來自於'(3 [1; 2; 4])',您正在應用'3'到'[1; 2; 4]'。在上下文中,你可能打算將函數'add'應用於參數'3'和'[1; 2; 4]'。你可以用符號'add 3 [1; 2; 4]' –

回答

3

ocaml的沒有內置集類型(而不是有一組模塊或庫)。所以,對於set常量也沒有內置的符號。

對於短小兩組,一組經常使用列表。事實上,List.mem是一個在列表(不設置)上運行的函數。列表的符號如下所示:[1; 2; 3; 4]

(作爲一個邊評論,您的命名add功能不添加任何東西,但也許你是剛剛開始。)

+0

謝謝!我實際上編輯了我的帖子,我的功能有誤。現在,我得到了另一個錯誤,即使我改變了它。它指的是什麼? – user1993381

+0

OCaml中的函數參數不加括號。要調用'add'你想要:'add 3 [1; 2; 4]'。我看到一些其他問題,但一次只能做一件事! –

+0

我改變了我的添加功能。我認爲遞歸部分可能有問題,但我不太確定它是什麼。 – user1993381

2

有OCaml中沒有固定的符號。我不知道你的'a set類型是什麼,我不明白爲什麼會員會用List.mem進行測試,但它應該沒有具體的表示法。

有一個Set.Make算符,標準庫,通過具有至少一個類型和密鑰的比較功能(see here)的模塊被實例化:

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]