簡體   English   中英

跨F#.fsx文件共享類型

[英]Sharing types across F# .fsx files

有沒有辦法在fsx文件之間共享類型?

當使用#load從多個FSX文件中加載包含類型的同一文件時,它們似乎每次都被前綴為不同的FS_00xx命名空間,這意味着您無法將它們傳遞出去。

有沒有解決此問題的方法,而不必訴諸於匯編?

至於

http://msdn.microsoft.com/en-us/library/dd233169.aspx

[.fsx文件]用於在F#中包含非正式測試代碼,而無需將測試代碼添加到您的應用程序中,也無需為其創建單獨的項目。 默認情況下,腳本文件不包含在項目的構建中,即使它們是項目的一部分也是如此。

這意味着,如果你有足夠的結構的項目是具有這樣的依賴問題,你不應該使用.fsx文件,而不是寫模塊/命名空間使用.fs文件。 也就是說,您確實應該將它們的類型編譯為程序集。

f#交互式解釋器為每個加載的文件生成程序集。 如果兩次加載文件,字節碼將生成兩次,並且即使它們具有相同的定義和名稱,它們的類型也會不同。 這意味着您無法在兩個.fsx文件之間共享類型,除非其中一個包含另一個

#load加載與環境中已經存在的文件類型相同的文件時,f#交互式解釋器可以使用兩種不同的策略:

  1. 如果與現有名稱發生沖突,則拒絕加載文件(說明已經定義了一些東西)
  2. 將名稱放在FS_00xx命名空間中(以便它們實際上與已加載的名稱類型不同),最終open結果名稱空間,以便從交互式會話中獲得名稱。

由於fsx文件應被用作非正式測試,因此使用第二種方法更為用戶友好(也存在使用第二種方法的技術原因,主要取決於.net VM類型系統,以及現有的類型不能在運行時更改)。

[ 注意:這是對特定問題的更具體答案,該問題是該問題的重復。]

我認為沒有一個很好且簡單的解決方案。 我在某些項目(例如F#代碼段網站 )中一直使用的一種解決方案是,只有一個頂級fsx文件可以加載多個fs文件。 例如,請參閱app.fsx

因此,您將具有從caller.fsx加載的common.fsintMapper.fsstringMapper.fs ,如下所示:

#load "common.fs"
#load "stringMapper.fs"
#load "intMapper.fs"
open Common

stringMapper.fsintMapper.fs內部,您不會加載common.fs 常見類型將在之前由caller.fsx加載,因此一切正常。

唯一的問題是intMapper.fs現在不是獨立的腳本文件-如果要在編輯器中自動完成,則需要添加一個fsproj文件來指定文件順序。 在F#代碼段項目中,有一個項目文件 ,指定編輯器應查看並加載文件的順序。

在實際上從fsi.exe運行的文件中擁有所有#load#open指令(在下面的示例中為C),並確保加載的文件本身不會#load自己的依賴項:

文件A.fsx,B.fsx,C.fsx。 B取決於A。C取決於B和A。

B包含

//adding the code below would cause the types defined in A to be loaded twice
//#load "A.fsx"
//#open A

C包含

#load "A.fsx"
#open A
#load "B.fsx"
#open B

不幸的是,這使得所有文件都難以從Visual Studio中進行編輯-編輯器不知道它們的依賴性,並顯示各種錯誤。

因此,這有點麻煩,建議的方法似乎是使用一個.fsx文件,然后將其他所有文件編譯成.dll:

 // file1.fsx #r "MyAssembly.dll" 

https://msdn.microsoft.com/zh-CN/library/dd233175.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM