OCaml:另一个函数内的调用函数

时间:2016-04-04 23:46:57

标签: ocaml

在一个模块中,我有一个用户定义的类型和一个返回字符串的递归函数。然后我想创建一个函数,它将创建该类型的对象并将其传递给函数。这是我的代码的一个简单示例:

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行放在一个函数中,以便它可以被另一个模块调用。我做错了什么?

1 个答案:

答案 0 :(得分:8)

你需要说

let dog = Mammal(Animal("Dog")) in
let dogstring = species_to_string dog in
print_string dogstring

也就是说,您需要使用关键字in

更长的解释:OCaml中let有两种不同的用法。在模块的顶层,它定义了模块的内容。您对species_to_stringprocess的定义就属于这种情况。在这些情况下,它没有in

在所有其他情况下(在最外面的定义内),唯一允许的形式是let var = expr in expr。即,in关键字是必需的。

let有两种不同的用途令人困惑,毫无疑问。但是一旦你习惯它就可以了。