【问题标题】:OCaml function syntax errorOCaml 函数语法错误
【发布时间】:2015-09-19 00:34:41
【问题描述】:

以下代码报错:

let alpha = Hashtbl.create 26 in
let print_and_add a =
    print_char a;
    Hashtbl.add alpha a true;;
let str = read_line () in
String.iter (fun x -> if Hashtbl.mem alpha x=false then print_and_add x) str

它应该做什么:每次调用函数时(使用 char 参数),它应该打印 char,并将其添加到哈希表(alpha)中。 我尝试对函数使用其他语法:

let alpha = Hashtbl.create 26 in
let print_and_add = (fun a ->
    print_char a;
    Hashtbl.add alpha a true) in
let str = read_line () in
String.iter (fun x -> if Hashtbl.mem alpha x=false then print_and_add x) str

但我仍然想知道为什么第一个代码会失败。 - 感谢您的帮助。

【问题讨论】:

    标签: function functional-programming ocaml


    【解决方案1】:

    当您尝试在第一个 sn-p 中第二次使用alpha 时,它不再在范围内。

    【讨论】:

    • 谢谢,但是为什么它在第二个代码sn-p的范围内?我看不出两者有什么大的区别。
    • let ... in ... 仅在本地绑定定义:因此是“in”。尽管你有缩进,前一种情况,你在定义 print_and_add 之后结束语句。
    • 缩进在语法上是无关紧要的。
    【解决方案2】:

    ;; 符号在全局级别专门标记表达式的结束。所以它之后的一切都必须是不同表达的一部分。因此,alpha 之后无法定义。

    我从不在源代码中使用;;,只有在输入顶层时才使用。在我看来,这就是它的目的。

    您的代码还有let print_and_add ...,但没有对应的in。这仅在全局级别有效(不在表达式内)。

    如果您将原始代码中的 ;; 更改为 in,您会得到一些有用的东西。至少它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多