F#和#x27;s";“你好,世界”;使用2个fs文件

F#和#x27;s";“你好,世界”;使用2个fs文件,f#,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 =

我从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)
我希望有两个.fs文件,即Alg.fs和Program.fs,这样Program.fs将包含我正在处理的代码,而Alg.fs包含算法

采取的步骤:
我已经创建了这两个文件。编译器出现错误:
库或多个文件应用程序中的文件必须以命名空间或模块声明开头,例如“namespace SomeNamespace.SubNamespace”或“module SomeNamespace.SomeModule”

我插入了
模块程序
模块Alg
。编译的程序只执行Alg.fs中的代码,完全忽略program.fs

我正在Visual Studio 2010中使用F#2.0。

顺便说一句,在询问之前,我已经在谷歌上搜索并检查了一下,阅读了相关文档并查看了相关信息。

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

此处至少需要查看三个单独的内容:

  • 正如@Brian所提到的,源代码管理文件的顺序也是编译顺序。这在F#中很重要,因为F#大量使用类型推断。确保Visual Studio文件列表中的
    Alg.fs
    位于
    Program.fs
    之前(尝试以下操作:选择
    Program.fs
    并点击
    Alt+向下箭头
    ,直到它位于底部)

  • 由于
    Alg.fs
    Program.fs
    现在位于模块中,因此您需要在
    Program
    中实际打开
    Alg
    模块以访问其绑定(
    open Alg
    ),或者在
    Alg
    上添加属性

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


  • Program.fs是项目中的最后一个文件吗?如果没有,你会想阅读。事实上,事物在使用之前必须声明,这可能是习惯于语言(如C#)的人的一个更大的绊脚石,在这种语言中,事物可以被向前声明。