2015-07-01 38 views
0

下面的代码给出了一个错误:OCaml的函数语法错误

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参数)的时候,它应该打印的字符,并将其添加到哈希表(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 

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

回答

1

alpha不再在您尝试在第一个片段中第二次使用它的范围内。

+0

谢谢,但它为什么在第二个代码段中的范围?我没有看到两者之间的巨大差异。 –

+0

'let ... in ...'仅将本地定义绑定到:因此“in”。尽管您的缩进是前一种情况,但您在定义print_and_add之后会结束语句。 – muhmuhten

+0

缩进在语法上无关紧要。 –

2

;;符号专门标记全局级别表达式的结尾。所以之后的所有内容都必须成为不同表达的一部分。因此alpha之后无法定义。

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

您的代码还有let print_and_add ...没有相应的in。这仅在全球范围内有效(不在表达式内)。

如果您在原始代码中将;;更改为in,您将得到一些可行的结果。至少它适合我。