F#命令行文件顺序?

时间:2011-07-25 22:40:26

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

请注意,前向引用实际上是编程语言和编译器的一个相当现代的特性(你不能将它们用于“免费”),如果你曾经使用过早期的C ++编译器,你可能还记得需要转发它们声明启用此功能(让编译器执行工作成本记忆并不总是如此丰富)。