2011-07-25 69 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#中密封重寫的成員。等等。 –