我正在尝试在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#的新手。有什么明显的东西我想念吗?
答案 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