F#的"Hello,world",包含2个fs文件

boh*_*nko 12 f#

我来自C#背景到F#.到目前为止,我编写了简单的程序,并在F#interactive中花了很多时间.

我很难创建一个带有两个.fs文件的VS F#项目.

示例代码:

// 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)
Run Code Online (Sandbox Code Playgroud)

我想要两个.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 Programmodule Alg.编译程序只执行Alg.fs中完全忽略Program.fs的代码...

我在Visual Studio 2010中使用F#
2.0.PS我已经用Google搜索并检查了一些帖子,阅读了有关模块的文档,并在询问之前查看了相关问题.

Bri*_*ian 22

听起来像这是一个项目中的文件订单问题.最后一个文件是入口点("主要方法"),听起来像你最后有Alg.fs,你最后需要Program.fs.您可以通过VS Solution Explorer中的右键单击上下文菜单重新排序它们.


yam*_*men 5

这里至少需要看三件事:

  1. 正如@Brian所提到的,源控制文件的顺序也是编译顺序.这在F#中很重要,其中大量使用类型推断.确保Alg.fs来之前Program.fs在Visual Studio中的文件列表(试试这个:选择Program.fs和命中Alt+Down Arrow,直到它的底部).

  2. 由于现在Alg.fsProgram.fs现在都在模块中,您需要实际打开Alg模块Program以访问其绑定(open Alg),或者添加[<AutoOpen>]属性Alg.

  3. 正如@Daniel所说,最后一个问题可能是程序入口点的定义.您需要顶级绑定[<EntryPoint>]上的属性,该属性也是最后一个文件中的最后一个函数.或者,这默认为最后一个文件中的最后一个绑定,只需确保它具有正确的签名(请参阅Daniel的链接).