/ / Tlač binárneho stromu v OCaml - ocaml, binárny strom, binárny vyhľadávací strom

Vytlačte binárny strom v OCaml - ocaml, binárnom stromu, binárnom vyhľadávacom strome

Som nováčik v OCaml a jazykoch rodiny ML. Mám tento binárny strom a chcem vytlačiť každý list. Tu je môj kód, ale zrejme to nefunguje. Povedzte mi prosím, čo je s ním zlé?

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

Toto je chyba, ktorú som dostal:

$ 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

odpovede:

6 pre odpoveď č. 1

Existuje niekoľko vylepšení, aby sa váš kód. Po prvé, vo vašej definícii funkcie:

let rec print_tree_infix tree = function

na function implicitne sa zhoduje s jednou hodnotou. Takže ste definovali funkciu, ktorá má dva argumenty namiesto jedného s prvým argumentom tree nepoužitie vo vnútri print_tree_infix, Ak zmeníte riadok na

let rec print_tree_infix = function

Vaša funkcia bude trvať jednu bintree hodnotu.

Po druhé, v OCaml nie je biely znak významný. Keď píšete

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

OCaml analyzuje to ako keby print_tree_infix mytree je súčasťou toho istého výrazu, ku ktorému ste priradili mytree, Problém analýzy môžete opraviť pridaním dodatku let ako toto

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

ktorá umožňuje OCaml vedieť, že ide o dve nezávislé definície.

S týmito zmenami by mal kód fungovať podľa očakávania!