Ошибка в Mono Compiler: файлы в библиотеках или многофайловых приложениях должны начинаться с пространства имен или объявления модуля - PullRequest
3 голосов
/ 21 апреля 2010

Я пытаюсь скомпилировать этот пример в моно на Ubuntu.

Однако я получаю ошибку

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 ]

4 голосов
/ 21 апреля 2010

Как указали Брайан и Скотт, вам нужно заключить файл в пространство имен или объявление модуля. Простое добавление 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

Но, конечно, вы можете добавить модуль верхнего уровня, как предлагает Брайан (более ранние версии F # автоматически использовали имя файла в PascalCase в качестве имени модуля верхнего уровня, используемого в файле) :

// 'main.fs' would be compiled as:
module Main
let foo a b = a + b
2 голосов
/ 21 апреля 2010

Вы можете исправить это, добавив

module theCurrentFileName

в начало каждого файла .fs.

Действительно, это новое требование, а образец устарел и нуждается в обновлении.

0 голосов
/ 21 сентября 2016

Старый вопрос, но я достиг его по той же проблеме, и я хочу добавить подсказку для модуля в 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
  • Вам не нужно вставлять объявления в модуль верхнего уровня.
  • Вы должны сделать отступ для всех объявлений в локальных модулях.
0 голосов
/ 21 апреля 2010

Эта проблема возникает из-за того, что эти примеры файлов были написаны для версии F #, которая не имела этого требования.

Как объясняется в сообщении об ошибке, все, что вам нужно сделать, это добавить namespace SomeNamespace в начало каждого файла, и он будет прекрасно компилироваться. Даже в моно на убунту.

...