【问题标题】:The namespace or module 'Lab2' is not defined未定义命名空间或模块“Lab2”
【发布时间】:2012-12-19 01:46:53
【问题描述】:

我查看了许多类似的问题,并在谷歌上搜索了几个小时,但我一无所获。

我正在尝试从 Program.fs 文件访问 Tree.fs 文件中的二叉树模块,并且在资源管理器窗口中,我已将 Tree.fs 文件移到 Program.fs 文件上方,正如几乎所有建议的那样其他类似的问题,但这对我不起作用。

我的 Tree.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"

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

    如果你编译运行项目,没有错误。根据您的结果,我猜您手动将两个文件的内容复制到 F# Interactive 中,除了带有命名空间和模块声明的第一行。在这种情况下,F# Interactive 不知道 Lab2 命名空间,因此会出现错误消息。一个快速的解决方法是改变

    open Lab2.BinaryTree 
    

    open BinaryTree
    

    它适用于fscfsi,因为ProgramBinaryTree 模块共享父命名空间Lab2

    但是,您在运行项目和在 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);;
    

    【讨论】:

    • 谢谢,解决了问题,我是 f# 新手,真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多