【问题标题】:OCaml dictionary updateOCaml 字典更新
【发布时间】:2014-01-18 17:34:34
【问题描述】:

我是 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)

我现在收到的错误消息是syntax error for line 6: with 这里有什么问题?另外,何时使用 in ;;;
我已经进行了一些谷歌搜索并了解in 似乎在下一个;; 之前定义了一些范围。但这对我来说仍然很模糊。能不能解释的更清楚一点?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    您的直接问题是,除了顶级,let 后面必须跟 in。表达式类似于 let variable = expression1 in expression2。这个想法是给定变量绑定到 expression2 主体中的 expression1 的值。你有一个let 没有in

    很难回答您更笼统的问题。处理一些特定的代码和特定的问题会更容易。

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

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

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

    【讨论】:

    • 感谢您的回复。 let myDict = MyUsers.add "test" "test2" myDict in 会更新字典 myDict 吗?
    • 不,没有什么会更新字典,正如我所说的 :-) 字典是不可变的。这个表达式创建了一个与旧字典同名的新字典。
    • 我明白了,但是因为它们的名称相同,所以会覆盖原来的那个吗?
    • 这是一个低级细节。在实践中,任何无法达到的值都将被 GC(最终)回收。但是根据代码的样子,这个值可能是可以达到的。也许看到这个 SO 页面:stackoverflow.com/questions/14440719/…
    猜你喜欢
    • 2022-11-08
    • 2017-03-23
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2017-07-18
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多