F#命令行文件顺序?

Jon*_*erg 2 f#

为什么看起来F#的参数顺序很重要?对于C#(使用相同的编译模型)无关紧要.当我尝试这个:

# main.fs
module Main
let main = Printer.print_repeatedly 5 "hello, world"

# printer.fs
module Printer
let print_repeatedly n str = for x in 1..n do printfn "%s" str
Run Code Online (Sandbox Code Playgroud)

我用printer.fs之前的main.fs执行编译器(包括Microsoft和Mono),我收到一个错误:

main.fs(4,12): error FS0039: The namespace or module 'Printer' is not defined
Run Code Online (Sandbox Code Playgroud)

如果我在命令行的main.fs之前执行printer.fs,那很好.编译器是否有理由要求F#?

Ste*_*sen 7

在F#中,传递给编译器的文件顺序绝对重要:F#编译器严格从左到右,从上到下读取程序.变量和类型只能引用它们之前定义的变量和类型,除非您明确指出相互递归的关系and.

如果你来自C#,这看起来似乎是一个限制.但是你了解到,在实践中,它实际上是一种非常有效的代码组织实施,并防止递归引用疯狂.

请注意,前向引用实际上是编程语言和编译器的一个相当现代的特性(你没有得到它们是"免费的"),如果你曾经使用过早期的C++编译器,你可能还记得需要前向声明才能启用这(让编译器完成工作成本记忆并不总是如此丰富).

  • 而最重要的一点,也与F#关心编译顺序的原因有关:F#比C#具有更好的类型推断. (3认同)
  • 更不用说它大大简化了依赖管理,这是大型项目的氪星石. (2认同)