2017-08-09 16 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と関数呼び出しを終了することと関係があると思いますが、この関数を呼び出す別の方法があり、その効果を持たせますか?私はSSは、文字列のセット・モジュールをrepesentsと仮定するつもりだここ

+0

'ac_ch'は*' ;; ' – Bergi

+0

何の機能あなたが話しているの後に結合していない*です。このような

何かが近いかもしれませんか?なぜあなたのコードは「in」で終わりますか? – Bergi

答えて

3

本当に困惑している。このような何かに宣言:

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

:あなたの最初の式は次のようになります

module SS = Set.Make(String) 

ac_chおよびremoveの定義はこの表現に対して局所的である。したがって、後のコードではこれらの名前のいずれにもバインドされていません。

あなたは最初の表現を "効果を持たせたい"としますが、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() 
関連する問題