2014-01-18 113 views
1

我是OCaml的新手,正在嘗試學習如何更新字典並處理if/else條件。
我寫了下面的代碼來檢查字典是否有一些關鍵字。如果不是,則爲該密鑰添加一個默認值。最後打印出來。OCaml字典更新

module MyUsers = Map.Make(String) 
let myGraph = MyUsers.empty;; 
let myGraph = MyUsers.add "test" "preset" myGraph in 
try 
    let mapped = MyUsers.find "test" myGraph 
with 
    Not_found -> let myGraph = MyUsers.add "test" "default" myGraph in 
Printf.printf "value for the key is now %s\n" (MyUsers.find "test" myGraph) 

該錯誤消息我現在已經是syntax error for line 6: with 這裏有什麼問題?另外,何時使用in;;;
我已經做了一些谷歌搜索,並明白in似乎定義一些範圍之前的下一個;;。但對我來說還是很模糊的。你能否更清楚地解釋一下?

回答

2

您的直接問題是,除了最高級別,let之後必須跟着in。表達看起來像let可變=表達式in表達式2。這個想法是給定的變量綁定在表達式2的主體中的值表達式1。你有一個let沒有in

很難回答你的一般問題。使用某些特定代碼和特定問題更容易。

但是,使用分號;分隔兩個要按順序評估的值。第一個應該有unit(意味着它沒有有用的值)。

在我看來,雙分號;;僅用於頂層,告訴解釋器您已經完成了輸入,並且它應該評估您到目前爲止給出的內容。有些人在實際的OCaml代碼中使用;;,但我沒有。

您的代碼強烈表明您正在考慮關於OCaml地圖。 OCaml地圖是不可變的;也就是說,您無法更改地圖的值。您只能製作一個與舊版地圖不同的新地圖。

+0

感謝您的回覆。將'讓myDict = MyUsers.add「測試」「test2」myDict in'更新字典myDict? – Ra1nWarden

+0

不,沒有東西會更新字典,正如我所說:-)字典是不可改變的。這個表達式創建了一個新的字典,它恰好與舊字典具有相同的名稱。 –

+0

我看到了,但是原來的一個被覆蓋,因爲它們具有相同的名稱? – Ra1nWarden