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


77

希望这会很容易。我有一个F#项目(最新的F#CTP),其中包含两个文件(Program.fs,Stack.fs)。在Stack.fs中,我有一个简单的名称空间和类型定义

Stack.fs

namespace Col

type Stack= 
 ...

现在,我通过声明将名称空间包含在Program.fs中

open Col

这不起作用,并给我错误“未定义名称空间或模块Col”。但是它是在同一项目中定义的。我必须错过一些明显的东西


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

Answers:


84

文件在项目中的顺序是什么?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


1
完善!多余的字符添加到令人满意的注释限制中。
JaredPar

1
这也让我感到震惊,我本以为F#编译器可以快速检查所有其他文件并查找缺少的模块...似乎很简单
Ed Ayers

“文件在项目中的顺序是什么?” 这是什么意思?所有文件都在同一文件夹中。
runeks

重要的是在.fsproj文件中列出文件的顺序。Visual Studio解决方案资源管理器应以相同顺序列出它们,并提供上下文菜单命令以将它们上移或下移。
Scott Hutchinson

42

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


我相信这些键绑定仅在安装了F#PowerTools的情况下可用(但无论如何大多数F#用户都会安装它们)。
亚伯

13

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

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

或者,您可以简单地安装F#PowerTools,它使您可以上下移动文件,将文件移动到目录或从中移出等等。将为您节省很多时间。
亚伯

2
只是在VS2015中发生过这种情况-向上或向下移动文件并不能解决问题-必须手动编辑.fsproj文件。-F#PowerTools中可能存在的错误
jps 2016年

1
@jps,是的,特别是我也注意到PowerTools的一些错误。在上/下移动目录时(它们最终位于fsproj的底部,而在VS中则更高)。在一个目录内移动通常是正确的(对我而言)。幸运的是,您现在可以直接在VS2015中编辑fsproj。
亚伯

1

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

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


1
我是F#的新手。如果我确实有循环依赖怎么办?这根本不可能吗?
MEMark 2013年

1
@MEMark在确实需要此类类型时,请使用“ and”关键字。
Goswin 2013年

0

我正在使用Visual Studio for Mac-8.1.4,并且我注意到某些.fs文件未标记为“编译”。您可以通过查看Build Output来查看此内容,并查看所有文件是否都在正确的顺序中。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.