2017-08-09 66 views
1

我有一個Ocaml的問題,我試圖從一個集合中刪除一個特定的值,並打印出不包含刪除值的集合。每次我寫這個函數,我都會得到一個錯誤。這是功能。函數調用沒有生效Ocaml

let ac_ch = ac_change p set in 
let remove = SS.remove pretty_print ac_ch in 
remove;; 
let _= (SS.iter print_endline ac_ch) in 
let _= print_newline() in 
let _= print_newline() in 
let _= print_newline() in 

但每次我運行這個,我得到的錯誤:Error: Unbound value ac_ch。我認爲它與終止函數調用remove;;然而,有沒有另一種方法來調用這個函數,並讓它的效果?我真的很困惑在這裏

+0

'ac_ch' *爲*綁定了'';;你在說些什麼 – Bergi

+0

功能之後?爲什麼你的代碼在一個流浪'in'中結束? – Bergi

回答

3

我要去假設SS可叫做字符串設定模塊,像這樣聲明:

module SS = Set.Make(String) 

你的第一個表達式如下:

let ac_ch = ... in let remove = ... in remove 

的此表達式的局部性爲ac_chremove的定義。所以在後面的代碼中沒有這些名稱的綁定。

你說你想要第一個表達式「有它的效果」,但OCaml中的集合是不可變的。也就是說,沒有任何效果可以應用於他們。表達式產生一個值remove,一個元素被刪除的集合,但是這個值在計算後面的任何地方都不會被使用。對任何以前存在的組都沒有影響。

您需要重新考慮您的計算,考慮到集合的不變性。

像這樣的東西可能更接近:

let ac_ch = ac_change p set in 
let remove = SS.remove pretty_print ac_ch in 
let _= (SS.iter print_endline remove) in 
let _= print_newline() in 
let _= print_newline() in 
let _= print_newline()