2009-12-08 75 views
2

我試圖使用一個fsi文件來允許單獨文件中的相互遞歸類,但我的fsi文件沒有編譯。下面是一個演示問題的簡單例子。F#簽名文件錯誤

文件program.fs:

module mod1 
type first = 
    |zero = 0 

文件File1.fs:

module mod2 
type second = 
    |zero2 = 0 

--sig:signature.fsi編譯產生:

#light 

module mod1 
type first = 
    | zero = 0 

module mod2 
type second = 
    | zero2 = 0 

其中已經上線的錯誤

type second 

這是

Error 1 Unexpected keyword 'type' in signature file. Expected ':', '=' or other token. 
+0

有什麼辦法來解決這個問題,而在一個合併兩個文件,正如我在這裏質疑的? http://stackoverflow.com/questions/31086071/forward-type-declaration-with-two-files?noredirect=1#comment50189391_31086071 – demas 2015-06-27 07:02:21

回答

1

你會認爲這是簽名文件是(像C++頭文件),但它不是。至少,這是我一開始就想到的。

在F#定義相互遞歸類型,唯一的辦法就是把他們相同的源文件中,並使用and關鍵字:

module mod1_mod2 
    type first = 
     | zero = 0 

    and second = 
     | zero2 = 0 
+0

那麼爲什麼編譯器會發出一個不能編譯的fsi文件呢? – 2009-12-08 11:24:23

+0

.fsi文件的主要用途是定義模塊公開的簽名(類型和函數)這是OCaml的一個概念。從.NET互操作的角度來看,在源代碼中將您的類型和函數直接標記爲公共/私有更加靈活。 – 2009-12-08 11:30:44

+0

啊,誤解了你的問題。我不知道爲什麼編譯器發出一個包含兩個模塊的.fsi文件。 – 2009-12-08 11:45:42