2016-04-04 4 views
0

В одном модуле у меня есть определенный пользователем тип и рекурсивная функция, которая возвращает строку. Затем я хочу создать функцию, которая создаст объект этого типа и передаст его функции. Вот простой пример кода, у меня есть: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 строки в функцию, чтобы ее можно было вызвать другим модулем. Что я делаю не так?

ответ

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. I.e., требуется ключевое слово in.

Имея два разных вида использования для let, вводит в заблуждение, нет никаких сомнений. Но как только вы привыкнете к этому, все в порядке.

Смежные вопросы