2011-07-25 62 views
2

为什么看起来F#参数的顺序很重要?它对于C#来说并不重要(它使用相同的编译模型)。当我试试这个:F#命令行文件顺序?

# 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 

我执行编译器(包括微软和Mono的)与main.fs前printer.fs,我得到一个错误:

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

如果我做printer.fs在命令行的main.fs之前,没关系。编译器是否需要这个用于F#的原因?

回答

7

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

如果你来自C#,这可能起初看起来像一个限制。但是你知道,实际上它实际上是一种非常有效的代码组织实施方式,可以防止递归引用的疯狂。

请注意,前向引用实际上是编程语言和编译器的一个相当现代的特性(如果你曾经使用早期的C++编译器,你可能会记得需要前向声明来实现这一点(使编译器执行工作成本内存,但这并不总是如此丰富)。

+2

更不用说它大大简化了依赖管理,这是大型项目的氪石。 – Daniel

+0

我已经使用C++了很多。我只是觉得奇怪,考虑到F#似乎大多遵循C#类型风格的编译模型,除了这个小小的警告。 –

+1

@Jonathan - 我认为F#和C#共享一个通用编译模型的程度,它们都被CLI绑定。我可以想到两者之间的一些重大差异,除此之外,C#支持隐式接口实现,并且它是推荐的“默认”,F#仅支持显式接口实现。 F#在C#中不支持公共静态只读字段。 F#不支持在C#中密封重写的成员。等等。 –