ocaml - 在OCaml中添加到字符串映射

标签 ocaml

我一直在试图弄清楚我认为是一个非常简单的任务,即从函数内部将条目添加到OCaml中的字符串映射中。相关元素如下:

module StringMap = Map.Make (String);;
let m = StringMap.empty;;

let rec count ke = match ke with
 |[] -> []
 |hd::tl -> begin let m = StringMap.add hd 1 m; [hd] @ count tl end;;

我一直收到神秘的“语法错误”消息,但是即使将代码分解为几乎没有内容后,我仍未找到解决方案。我可以使用单个命令将其添加到字符串映射中,但是如果我尝试从函数内部运行let m = StringMap.add hd 1 m,它将无法运行。我敢肯定这是一个简单的问题,但是有人可以帮忙吗?谢谢。

最佳答案

您的代码似乎存在一些问题。但是首先,这是一个有关如何执行您要执行的操作的示例:

module StringMap = Map.Make (String)

let rec count m ke =
    match ke with
    | [] -> m
    | hd :: tl -> count (StringMap.add hd 1 m) tl

let m = count StringMap.empty ["foo"; "bar"; "baz"]

对原始代码的一些注释:
  • 双分号用于告诉REPL循环您希望它使用您的代码。如果不使用它们,则应避免使用它们。
  • 单分号用于分隔命令式表达式,例如跟随一个任务。在这里,您有一个let表达式,其语法为“let <..> in <..>”,因此在分号后使用是错误的。 (“let a = ...”(不带“in”)是顶级构造,而不是您可以在本地使用的东西)。
  • StringMap(以及ocaml中的大多数其他结构)是功能性的,而非强制性的。您不能更改第一行中声明的“m”。您必须构建结构,最后在循环末尾返回完整构建的结构。
  • 关于ocaml - 在OCaml中添加到字符串映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3878527/

    相关文章:

    Ocaml:获取进程的 CPU 使用率

    recursion - 使用递归累积列表时出现类型错误

    opengl - OCaml:在 GTK 中嵌入 openGL

    compiler-construction - 创建编译器 : Learn OCaml or Stick With Java/C/C++

    c++ - Ocamlopt 不产生任何输出,只有一个错误代码

    linux - 获取 OCaml 中特定接口(interface)的 IP 地址

    ocaml - OCaml 中的 include、require 和 open 有什么区别?

    functional-programming - 是否可以在 OCaml 中使其完全多态?

    f# - 使用延续将二元递归转化为尾递归

    data-structures - 在多个字段上建立索引的哈希表