15

我来自 C# 背景到 F#。到目前为止,我编写了简单的程序,并在 F# 交互方面花费了很多时间。

我坚持用两个 .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)

我想要两个 .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 我已经用谷歌搜索并检查了一些帖子,并阅读了有关模块的文档并在询问之前看到了相关问题

4

2 回答 2

24

听起来这是一个项目中的文件顺序问题。最后一个文件是入口点(“主方法”),听起来你最后有 Alg.fs,最后需要 Program.fs。您可以通过 VS 解决方案资源管理器中的右键单击上下文菜单对它们重新排序。

于 2012-04-16T20:38:59.063 回答
7

这里至少需要考虑三个不同的事情:

  1. 正如@Brian 所说,源代码控制文件的顺序也是编译顺序。这在大量使用类型推断的 F# 中很重要。确保Alg.fs出现Program.fs在您的 Visual Studio 文件列表中(试试这个:选择Program.fs并点击Alt+Down Arrow直到它位于底部)。

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

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

于 2012-04-16T20:57:02.467 回答