单声道编译器出错:库或多文件应用程序中的文件必须以命名空间或模块声明开头

时间:2010-04-21 03:17:38

标签: f# mono compiler-errors

我正在尝试在ubuntu上以单声道编译this example

但是我收到了错误

wingsit@wingsit-laptop:~/MyFS/kitty$ fsc.exe -o kitty.exe  kittyAst.fs kittyParser.fs kittyLexer.fs main.fs 
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

/home/wingsit/MyFS/kitty/kittyAst.fs(1,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'

/home/wingsit/MyFS/kitty/kittyParser.fs(2,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'

/home/wingsit/MyFS/kitty/kittyLexer.fsl(2,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
wingsit@wingsit-laptop:~/MyFS/kitty$ 

我是F#的新手。有什么明显的东西我想念吗?

4 个答案:

答案 0 :(得分:4)

正如Brian和Scott指出的那样,您需要将文件包含在命名空间或模块声明中。如果您在文件中具有顶级namespace SomeNamespace绑定,则仅添加let可能不起作用(因为这些绑定必须在某个模块中)。以下内容无效:

namespace SomeNamespace
let foo a b = a + b   // Top-level functions not allowed in a namespace

也就是说,我更喜欢在顶层使用namespace而不是module,然后明确地将所有函数包装在module中(因为我认为这会使代码更具可读性):

namespace SomeNamespace
module FooFunctions =     
  let foo a b = a + b

但是当然,你可以像Brian建议的那样添加顶层模块(早期版本的F#自动使用 PascalCase 中文件的名称作为文件中使用的顶级模块的名称):

// 'main.fs' would be compiled as:
module Main
let foo a b = a + b

答案 1 :(得分:2)

您可以通过添加

来修复它
module theCurrentFileName

到每个.fs文件的顶部。

实际上,这是一个较新的要求,样本已经过时,需要更新。

答案 2 :(得分:0)

出现此问题是因为这些示例文件是针对没有该要求的F#版本编写的。

正如错误消息所解释的那样,您需要做的就是将namespace SomeNamespace添加到每个文件的顶部,它将编译得很好。即使是在ubuntu上的单声道。

答案 3 :(得分:0)

老问题,但我为同样的问题达成了目标,我想在F#3中为模块添加提示。

在多文件应用程序中,您不需要使用命名空间,但是您应该使用模块

以这种方式声明的顶级模块声明(没有等号=)

 module module_name
 //Not
 module module_name =

同一文件中的本地模块,使用" =" 例如:

 module toplevel        // top level module without "="

 module module1 =      // local module with "="
   let square x = x*x

 module module2 =
   let doubleit x = 2*x
  • 您不必在顶级模块中缩进声明。
  • 您必须缩进本地模块中的所有声明。