F# 在同一项目的另一个文件中定义/使用类型/模块

Posted

技术标签:

【中文标题】F# 在同一项目的另一个文件中定义/使用类型/模块【英文标题】:F# defining/using a type/module in another file in the same project 【发布时间】:2010-09-15 10:22:17 【问题描述】:

希望这将是一件容易的事。我有一个带有两个文件(Program.fs、Stack.fs)的 F# 项目(最新的 F# CTP)。在 Stack.fs 我有一个简单的命名空间和类型定义

堆栈.fs

namespace Col

type Stack= 
 ...

现在我尝试通过声明将命名空间包含在 Program.fs 中

open Col

这不起作用并给我错误“未定义命名空间或模块 Col”。然而它是在同一个项目中定义的。我必须遗漏一些明显的东西

【问题讨论】:

提示:如果您需要在 Visual Studio 中更改文件的顺序,请安装 F# PowerTools,并在解决方案资源管理器中使用 Alt+Arrow 移动它们(或右键单击) .您还可以将它们移动到其他文件夹,或创建新文件夹等。 【参考方案1】:

项目中文件的顺序是什么? Stack.fs 需要在 Program.fs 之前,以便 Program.fs 能够“看到”它。

参见开头

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!444.entry

和结束

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!347.entry

【讨论】:

完美!为满足评论限制添加了额外字符。 这个也引起了我的注意,我原以为 F# 编译器可以快速检查所有其他文件并查找丢失的模块...看起来很简单 "项目中文件的顺序是什么?"这是什么意思?所有文件都在同一个文件夹中。 文件在 .fsproj 文件中列出的顺序很重要。 Visual Studio 解决方案资源管理器应以相同的顺序列出它们,并提供上下文菜单命令以将它们向上或向下移动。【参考方案2】:

我有同样的问题,你是对的,编译器会考虑文件的顺序。您可以使用与 .fs 文件关联的上下文菜单中的上移/下移项目,而不是删除和添加模式。 (Alt-Up 和 Alt-Down 是大多数标准键绑定中的快捷键)

【讨论】:

我相信这些键绑定仅在安装了 F# PowerTools 时可用(但大多数 F# 用户还是安装了它们)。【参考方案3】:

以上都是正确的,但是如何在VS2013中做到这一点是另一个问题。我必须手动编辑我的 .fsproj 文件,并在 ItemGroup 节点中按确切顺序设置文件。在这种情况下,它看起来像这样:

<ItemGroup>
    <Compile Include="Stack.fs" />
    <Compile Include="Program.fs" />
    <None Include="App.config" />
</ItemGroup>

【讨论】:

或者您可以简单地安装F# PowerTools,它允许您向上或向下移动文件、将它们移动到目录或移出目录等等。将为您节省大量时间。 刚刚在 VS2015 中发生过这种情况 - 向上或向下移动文件并不能解决问题 - 必须手动编辑 .fsproj 文件。 - F# PowerTools 中可能存在的错误 @jps,是的,我也注意到 PowerTools 的一些错误,尤其是。向上/向下移动目录时(它们在 fsproj 中位于底部,但在 VS 中显得更高)。在一个目录中移动通常是正确的(对我来说)。幸运的是,您现在可以直接在 VS2015 中编辑 fsproj。【参考方案4】:

我有同样的问题,确实是文件的顺序。但是,上面的链接没有描述如何在 Visual Studio 2008 F# 1.9.4.19 中修复它。

如果您打开一个模块,请确保您的源文件位于解决方案资源管理器中的依赖项之后。只需右键单击您的源并选择删除。然后重新添加它。这将使它出现在列表的底部。希望你没有循环依赖。

【讨论】:

我是 F# 新手。如果我确实有循环依赖怎么办?这根本不可能吗? @MEMark 在您确实需要此类类型时使用“and”关键字。【参考方案5】:

我正在使用 Visual Studio for Mac - 8.1.4,我注意到一些 .fs 文件未标记为“编译”。您可以通过查看构建输出来查看这一点,并查看您的所有文件是否都在那里并且顺序正确。

我不得不手动确保某些文件被标记为“编译”,并且不得不手动上下移动它们直到它“占用”。

【讨论】:

以上是关于F# 在同一项目的另一个文件中定义/使用类型/模块的主要内容,如果未能解决你的问题,请参考以下文章

Python:从项目层次结构中同一级别的另一个目录导入模块

从当前项目中的另一个模块启动 MainActivity

无法将 Java 项目中的类文件导入同一项目中的另一个类文件

在同一个类的另一个成员函数的定义中调用一个类成员函数

无法使用从 python 中同一目录中的另一个文件访问的类

无法使用 awsvpc 网络类型与 ECS Fargate 上同一任务中的另一个容器通信