2016-08-24 3 views
1

Я новичок в OCaml и языках семейства ML. У меня есть это двоичное дерево, и я хочу напечатать каждый лист. Вот мой код, но, видимо, он не работает. Не могли бы вы рассказать мне, что с этим не так? Благодарю.Печать двоичного дерева в OCaml

open Core.Std 
open Printf 

type bintree = Leaf of int 
      | Node of bintree * int * bintree 

let rec print_tree_infix tree = function 
    Leaf n -> 
    Printf.printf "%d" n 
    | Node (left, n, right) -> 
    Printf.printf "%d" n; 
    print_tree_infix left; 
    print_tree_infix right 

let mytree = Node(Node(Leaf 6, 3, Leaf 9), 8, Node(Leaf 7, 9, Leaf 2)) 
print_tree_infix mytree 

Это ошибка я получил:

$ ocaml setup.ml -build 
Finished, 0 targets (0 cached) in 00:00:00. 
+ ~/.opam/system/bin/ocamlfind ocamldep -package core -package threads -modules src/main.ml > src/main.ml.depends 
File "src/main.ml", line 16, characters 0-16: 
Error: Syntax error 
Command exited with code 2. 
Compilation unsuccessful after building 1 target (0 cached) in 00:00:00. 
E: Failure("Command ''/usr/bin/ocamlbuild' src/main.byte -tag debug' terminated with error code 10") 
make: *** [Makefile:7: build] Error 1 
+2

В будущем это может помочь показать как ваш код, так и ошибки (-ы), которые вы видите. – hcarty

+2

«По-видимому, это не работает» на самом деле мало что говорит. Не могли бы вы рассказать нам точно, что вы ожидаете получить, и что вы получаете вместо текущей версии кода? Во всяком случае, есть по крайней мере две проблемы: вам нужно либо поместить ';;' в конце определения letittree, либо начать следующую строку с 'let() =', чтобы четко разделить две фразы и что у вас есть префиксный обход, а не инфикс, как показывает название функции. – Virgile

ответ

6

Есть несколько настроек, чтобы сделать ваш код. Во-первых, в определении функции:

let rec print_tree_infix tree = function 

function неявно соответствует шаблону против одного значения. Таким образом, вы определили функцию, которая принимает два аргумента, а не один, причем первый аргумент tree не используется внутри print_tree_infix. Если вы измените эту строку в

let rec print_tree_infix = function 

ваша функция будет принимать один bintree значение в качестве аргумента.

Во-вторых, пробелы в OCaml не значительны. Когда вы пишете

let mytree = Node(Node(Leaf 6, 3, Leaf 9), 8, Node(Leaf 7, 9, Leaf 2)) 
print_tree_infix mytree 

OCaml разбирает, что, как будто print_tree_infix mytree является частью одного и того же выражения вы присваивающей к mytree. Вы можете решить эту проблему при разборе путем добавления дополнительного let как этот

let mytree = Node(Node(Leaf 6, 3, Leaf 9), 8, Node(Leaf 7, 9, Leaf 2)) 
let() = print_tree_infix mytree 

, который позволяет OCaml знать, что эти два независимых определения.

С этими изменениями ваш код должен работать должным образом!

+0

Спасибо! Это сработало отлично. –

+0

«Как и ожидалось» по сравнению с тем фактом, что печать не выполняется инфиксами, как следует из названия, и что она не просто печатает «каждый лист», как указывает ОП. ;) – gallais

+1

@ gallais Это справедливо :-) «Как и ожидалось», возможно, должно быть «написано» в этом случае. – hcarty

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