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

Здесь есть как минимум три вещи, которые нужно посмотреть здесь:

  1. Как уже упоминалось @Brian, порядок файлов управления исходным кодом также является порядком компиляции. Это имеет значение в F #, где выведение типов активно используется. Убедитесь, что Alg.fs стоит перед Program.fs в списке файлов Visual Studio (попробуйте следующее: выберите Program.fs и нажимайте Alt+Down Arrow, пока он не будет внизу).

  2. Поскольку Alg.fs и Program.fs теперь находятся в модулях, вам нужно фактически открыть модуль Alg в Program, чтобы получить доступ к его привязкам (open Alg), или добавить [<AutoOpen>] атрибут в Alg.

  3. Как говорит @Daniel, последней проблемой может быть определение точки входа в программу. Вам нужен либо атрибут [<EntryPoint>] в привязке верхнего уровня, который также является последней функцией в последнем файле. В качестве альтернативы, это по умолчанию последняя привязка в последнем файле в любом случае, просто убедитесь, что он имеет правильную подпись (см. ссылку Daniel).