2

私は多くの同様の質問を見て、数時間グーグルを検索しました、そして、私はどこにも行きません。

Program.fsファイルからTree.fsファイルにあるバイナリツリーモジュールにアクセスしようとしています。エクスプローラーウィンドウで、他のほとんどすべてで提案されているように、Tree.fsファイルをProgram.fsファイルの上に移動しました。同様の質問ですが、これは私にとってはうまくいかないまでです。

MyTree.fsファイル

namespace Lab2

type Elem = System.IComparable

type Tree = E | T of Tree * Elem * Tree

module BinaryTree =
    let emptyTree = E

    let rec add = function
                    | x, E -> T(E, x, E)
                    | x, T(a, y, b) when x < y -> T(add(x, a), y, b)
                    | x, T(a, y, b) when y < x -> T(a, y, add(x, b))
                    | _, s -> s

    let rec addList = function
                        | [], T(a, y, b) -> T(a, y, b)
                        | x::xs, T(a, y, b) when x < y -> addList(xs, T(add(x, a), y, b))
                        | x::xs, T(a, y, b) when y < x -> addList(xs, T(a, y, add(x, b)))
                        | _, s -> s


    let rec preorder = function
                        | T(a, y, b) when a <> E -> y::preorder a
                        | T(a, y, b) when b <> E -> y::preorder b
                        | _ -> []

    let rec inorder = function
                        | T(a, y, b) when a <> E -> y::inorder a
                        | T(a, y, b) when b <> E -> y::inorder b
                        | _ -> []

    let rec postorder = function
                        | T(a, y, b) when b <> E -> y::preorder b
                        | T(a, y, b) when a <> E -> y::preorder a
                        | _ -> []

    let rec treeToString = function
                            | T(a, y, b) when a <> E -> "(node " + y.ToString() + treeToString a
                            | T(a, y, b) when b <> E -> y.ToString() + treeToString b + ")"
                            | _ -> "Empty"

私のProgram.fsファイル

module Lab2.Program

open Lab2.BinaryTree

let tree = addList([5; 2; 1; 6; 7], emptyTree);;

let inorder_tree = inorder(tree);;

let char_tree = addList(['e';'b';'a';'f';'g'], emptyTree);;

let inorder_char_tree = inorder(char_tree);;

let print = treeToString(char_tree);;

両方のファイルでLab2名前空間を使用せず、代わりに両方のファイルをモジュールとして使用しようとしましたが、それでも同じエラーが発生します。

コードに青または赤の線がなく、デバッグするまでエラーはありません

エラーは次の行でのみ発生します

let tree = addList([5; 2; 1; 6; 7], emptyTree);;

したがって、デバッグすると次のようになります

Program.fs(66,6): error FS0039: The namespace or module 'Lab2' is not defined
> val inorder_tree : Elem list = []
> val char_tree : Tree = E
> val inorder_char_tree : Elem list = []
> val print : string = "Empty"
4

1 に答える 1

4

プロジェクトをコンパイルして実行すると、エラーは発生しません。結果に基づいて、名前空間とモジュール宣言を含む最初の行を除いて、2 つのファイルの内容を F# Interactive に手動でコピーしたと思います。この場合、Lab2名前空間が F# Interactive によって認識されなかったため、エラー メッセージが表示されます。手っ取り早い解決策は、変更することです

open Lab2.BinaryTree 

open BinaryTree

とモジュールは親の名前空間を共有するため、 との両方で機能しfscます。fsiProgramBinaryTreeLab2

ただし、プロジェクトを実行するか、F# Interactive で実行するかについて混乱しています。一般的な解決策は、ファイルを作成し、Tree.fsxそれに対応するモジュールをロードすることです。

#load "Tree.fs"    
open Lab2.BinaryTree

let tree = addList([5; 2; 1; 6; 7], emptyTree);;
let inorderTree = inorder(tree);;
let charTree = addList(['e';'b';'a';'f';'g'], emptyTree);;
let inorderCharTree = inorder(charTree);;
let print = treeToString(charTree);;
于 2012-12-17T08:53:14.160 に答える