OCaml字典更新

OCaml字典更新,ocaml,Ocaml,我是OCaml新手,正在尝试学习如何更新字典和处理if/else条件 我编写了以下代码来检查字典是否有一些键。如果不是,请为该键添加默认值。最后打印出来 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

我是OCaml新手,正在尝试学习如何更新字典和处理if/else条件
我编写了以下代码来检查字典是否有一些键。如果不是,请为该键添加默认值。最后打印出来

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)
我现在看到的错误消息是第6行的
语法错误:with
这里怎么了?另外,何时在
中使用


我做了一些谷歌搜索,了解到在下一个
之前,
中的
似乎定义了一些范围。但这对我来说仍然很模糊。你能更清楚地解释一下吗?

你眼前的问题是,除了在顶层,
let
后面必须跟着
。表达式类似于
expression2中的
let
variable
=
expression1
。其思想是,给定变量绑定到表达式2中表达式1的值。您有一个
let
,其中没有

很难回答你更笼统的问题。使用特定代码和特定问题更容易

但是,分号
用于分隔要按顺序计算的两个值。第一个应该有type
unit
(这意味着它没有有用的值)

在我看来,双分号
仅在顶级中用于告诉解释器您已经完成了输入,并且它应该评估您到目前为止给出的内容。有些人使用
在实际的OCaml代码中,但我没有


您的代码强烈表明您必须考虑OCaml映射。OCaml映射是不可变的;也就是说,不能更改贴图的值。您只能生成与旧地图内容不同的新地图。

谢谢您的回复。将
让myDict=MyUsers.add“test”“test2”myDict添加到
更新字典myDict?不,没有任何东西会更新字典,正如我所说:-)字典是不可变的。这个表达式创建了一个新字典,它恰好与旧字典同名。我知道了,但是原始字典是否因为同名而被覆盖?这是一个低级细节。实际上,GC(最终)将回收任何无法达到的值。但是,根据代码的外观,可以访问该值。可能会看到这页: