除了從潛在的名稱衝突的特定部分 - 可以圍繞通過其他方式獲得 - 有你需要的任何好處,從一個模塊中導入只有部分:效益導入哈斯克爾模塊
import SomeModule (x, y, z)
...經文只導入這一切,這是更簡潔,更易於維護:
import SomeModule
難道讓二進制較小,例如?
除了從潛在的名稱衝突的特定部分 - 可以圍繞通過其他方式獲得 - 有你需要的任何好處,從一個模塊中導入只有部分:效益導入哈斯克爾模塊
import SomeModule (x, y, z)
...經文只導入這一切,這是更簡潔,更易於維護:
import SomeModule
難道讓二進制較小,例如?
不,這只是爲了防止名稱衝突。防止名稱衝突的另一種機制 - 即import qualified
- 會導致更詳細(較少可讀)的代碼。
它不會使二進制變小 - 考慮到給定模塊中的函數通常都是相互引用的,所以它們需要一起編譯。
名稱衝突和二進制大小優化只是您可以獲得的兩個好處。的確,總是確定你想從代碼的外部世界獲得什麼是一個好習慣。所以,每當人們看你的代碼時,他們都會知道你的代碼請求的是什麼。
這也給你一個很好的機會爲測試創建嘲笑解決方案,因爲你可以通過導入列表工作併爲它們編寫嘲弄。
不幸的是,在Haskell中,類的類實例並不那麼容易。它們是隱式導入的,因此可能會產生衝突,也可能會讓模擬變得更難,因爲沒有辦法只指定特定的類實例。希望這可以在未來版本的Haskell中修復。
UPDATE
我上述(代碼維護和測試嘲笑)中列出的典型應用該類超支不限於Haskell中。據我所知,其實在Java中也是很常見的做法。在Java中,您可以只導入一個類,甚至可以導入一個靜態變量/方法。不幸的是,你仍然不能有選擇地導入成員函數。
我第二個這個答案。想想稍後來的人,並嘗試閱讀你的代碼;如果你的模塊使用一個名爲'frobnicate'的函數,他們怎麼知道它來自哪個進口模塊?他們可以grep或hoogle它,但也許有多個模塊定義該名稱的功能,然後他們需要與導入等交叉引用。更好的是在您的導入中更具體 - 雖然它不是一個難和快速的規則。 –
如果他們可以在GHCi中打開該模塊,那麼':我frobnicate'通常會告訴你它被發現的文件。也可以通過ghc-mod來獲得這個文件。 –
@ J.Abrahamson如果你*不能*在GHCi中打開模塊,因爲編譯失敗並且沒有定義'frobnicate'消息。顯式導入可以告訴你它是從哪裏來的,當你拿起曾經工作但需要被轉發的舊代碼時,這一點非常重要。 – Ben
idk如果它會使一個二進制小,但它可以很好,如果有功能衝突你不需要的功能。而不是導入一個合格的模塊,然後輸入你一遍又一遍地輸入的內容。您只需導入您需要的零件,而不必導入合格的零件。 – DiegoNolan