[英]DIfference between Modules and Namespaces in F#
我在理解F#中的模塊和命名空間之間的確切區別以及使用其中一個時遇到了問題。 好吧,它們都被認為是為了封裝代碼並定義層次結構以使我們的項目井井有條。
模塊具有許多功能:它們可以包含值,各種類型,這些元素也可以定義為public
, protected
或internal
。
但是,在使用模塊時?
我也理解模塊最終被映射為MSIL(中間語言)中的類。 所以一個模塊是一個類,是一個類型....我的懷疑'幅度提高....
使用模塊時??? 它們有用嗎?
D. Syme還認為模塊是可擴展的,所以我認為從這個角度看它們就像命名空間一樣。
我無法理解使用它們的原因。
謝謝
一個主要區別:
.Net名稱空間不能保存值 (讓定義)而模塊可以。
在IL / Bytecode級別,模塊被編譯為.net類,而不是.net名稱空間。
什么時候使用模塊?
對於一個小而具體的任務,F#和其他FP通常遵循自下而上編程的模式:將任務分解為一組小函數,然后將這些函數分組到一個模塊中。
答案是,使用模塊將一組相關函數和其他F#值和類型組合在一起是非常自然的。
雖然命名空間用於分組更大的東西:例如Matrix操作的所有類。
模塊不是靜態類(在C#意義上)模塊可以保存特殊的F#值,例如curried函數; 雖然靜態類不能。
正如尹朱所說,模塊可以保持價值。 您可以打開名稱空間等模塊。 這兩個功能在一起就是為什么在F#中你可以做的事情
let z = max x y
而在像C#這樣的語言中,你總是要說些什么
var z = Math.Max(x,y)
// ^^^^^ can't call methods from elsewhere without a qualifier
並使用限定名稱( SomeClass.Method
)而不僅僅是名稱( letBoundFunction
)。 所以你可以使用模塊,當你希望人們能夠打開你的模塊Foo
並通過只是說bar
而不是Foo.bar
調用bar
。 (這對於操作員特別有用,例如,如果您在庫中定義了一堆用戶定義的操作符(例如+++
或whatnot),通過將它們放在模塊中,人們可以打開模塊然后只使用例如x +++ y
而不是像(Foo.+++) xy
或其他任何繁瑣的東西。)
請注意,雖然默認情況下F#將代碼放在模塊中的.fs文件中(帶有文件名),但您可以通過將文件中的第一個代碼作為名稱空間聲明來更改此項,例如
namespace Yadda
// declare some types or whatnot, they go in namespace Yadda
或者通過聲明自己的模塊
module Blah
// stuff goes in Blah module
在文件的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.