F # "Привет, мир" с файлами 2 fs
Я исхожу из фона С# в F #. До сих пор я писал простые программы и проводил много времени в интерактивном режиме F #.
Я застрял в создании проекта VS F # с двумя файлами .fs.
Пример кода:
// part 1: functions
let rec gcd (a : uint64) (b : uint64) =
if b = 0UL then a
else gcd b (a % b)
// part 2: main()
let a, b = (13UL, 15UL)
do printfn "gcd of %d %d = %d" a b (gcd a b)
Я хотел бы иметь два файла .fs, а именно Alg.fs и Program.fs, так что Program.fs будет содержать код, который я работаю, и Alg.fs, имеющий алгоритмы.
Взятые шаги:
Я создал два файла. Компилятор дал ошибку: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
Я вставил module Program
и module Alg
. Выполненная программа выполняет только код из Alg.fs, полностью игнорирующий Program.fs...
Я использую F # 2.0 в Visual Studio 2010.
Постскриптум Я googled и проверил несколько сообщений и прочитал документацию по модулям и перед тем, как задать вопрос, просмотрите questions.
Ответы
Ответ 1
Похоже, что это проблема с заказами-в-проекте. Последний файл - это точка входа ( "основной метод" ), похоже, что у вас есть Alg.fs last, и вам нужно Program.fs last. Вы можете переупорядочить их через контекстное меню правой кнопки мыши в VS Solution Explorer.
Ответ 2
Здесь есть как минимум три вещи, которые нужно посмотреть здесь:
Как уже упоминалось @Brian, порядок файлов управления исходным кодом также является порядком компиляции. Это имеет значение в F #, где выведение типов активно используется. Убедитесь, что Alg.fs
стоит перед Program.fs
в списке файлов Visual Studio (попробуйте следующее: выберите Program.fs
и нажимайте Alt+Down Arrow
, пока он не будет внизу).
Поскольку Alg.fs
и Program.fs
теперь находятся в модулях, вам нужно фактически открыть модуль Alg
в Program
, чтобы получить доступ к его привязкам (open Alg
), или добавить [<AutoOpen>]
атрибут в Alg
.
Как говорит @Daniel, последней проблемой может быть определение точки входа в программу. Вам нужен либо атрибут [<EntryPoint>]
в привязке верхнего уровня, который также является последней функцией в последнем файле. В качестве альтернативы, это по умолчанию последняя привязка в последнем файле в любом случае, просто убедитесь, что он имеет правильную подпись (см. ссылку Daniel).