在一个模块中,我有一个用户定义的类型和一个返回字符串的递归函数。然后我想创建一个函数,它将创建该类型的对象并将其传递给函数。这是我的代码的一个简单示例:
type species =
Animal of string
| Mammal of species
| Fish of species
let rec species_to_string = function
| Animal (x) -> x
| Mammal (x) -> "Mammal (" ^ (species_to_string x) ^ ")"
| Fish (x) -> "Fish (" ^ (species_to_string x) ^ ")"
let process () =
let dog = Mammal(Animal("Dog"))
let dogstring = species_to_string dog
print_string dogstring
但是当我尝试编译时,我收到错误:
File "test.ml", line 13, characters 1-4:
Error: Syntax error
其中第13行是我上例中的第二行。
我的代码似乎不是问题。当我将代码更改为:
type species =
Animal of string
| Mammal of species
| Fish of species;;
let rec species_to_string = function
| Animal (x) -> x
| Mammal (x) -> "Mammal (" ^ (species_to_string x) ^ ")"
| Fish (x) -> "Fish (" ^ (species_to_string x) ^ ")";;
let dog = Mammal(Animal("Dog"));;
let dogstring = species_to_string dog;;
print_string dogstring;;
它编译并正确运行。但是我需要将最后3行放在一个函数中,以便它可以被另一个模块调用。我做错了什么?
答案 0 :(得分:8)
你需要说
let dog = Mammal(Animal("Dog")) in
let dogstring = species_to_string dog in
print_string dogstring
也就是说,您需要使用关键字in
。
更长的解释:OCaml中let
有两种不同的用法。在模块的顶层,它定义了模块的内容。您对species_to_string
和process
的定义就属于这种情况。在这些情况下,它没有in
。
在所有其他情况下(在最外面的定义内),唯一允许的形式是let var = expr in expr
。即,in
关键字是必需的。
let
有两种不同的用途令人困惑,毫无疑问。但是一旦你习惯它就可以了。