2013-10-20 82 views
9

對不起,這個非常基本的問題:在GHCi中,import Library.Name:m +Library.Name之間有區別嗎?它們看起來是相同的,但我認爲這是另一種語法的原因。Haskell庫導入語法

回答

6

您可能會在源代碼中包含import,這是更一般的,而:m是ghci特定的命令(爲了方便起見)。可以使用ghci> :m + Module1 ... ModuleN加載多個模塊。使用-而不是+卸載模塊。由於ghci是互動的,我會堅持:m,除非您的工作流程是:編輯您的.hs文件,保存並重新加載。那麼import會更合適(並且具有更多特徵,例如qualified imports)。

如果您以後決定使用例如ghc編譯程序,import指令也可以工作。你可以有選擇地只導入特定的功能:import Data.List (sort)只會導入排序,所以會污染名字空間。

+1

那麼:簡單來說簡潔? – planarian

+0

它發生在我身上:m一旦它們被導入,它也允許*刪除*庫。 – planarian

+0

是的,如果你使用'-'而不是'+' – jev

9

你說得對,import Module:module + Module是相同的,但是:module(此後縮寫爲:m)語法有幾個原因。

  1. 年齡較大。 GHCi真的只是在IOdo區塊的內部;現在它支持語言的每個部分,所以我們可以做import s。 (它看起來像GHCi 6.6.x didn't support import,但是GHCi 6.8.1 did;我們沒有得到完全支持頂層聲明,直到GHCi 7.4.1。)

  2. 它允許您一次導入多個模塊。 :m + M1 M2 M3與在新行上分別書寫import M1import M2import M3相同。

  3. 它允許您取消導入模塊::m - M將從提示中的當前範圍中刪除M的內容。

  4. 它允許您導入解釋模塊,以便您可以看到整個範圍內的整個。這是當你:load File.hs;你發現你在模塊*File,並可以例如查看File導入的所有內容,以及它不導出的所有內容。如果您已經加載瞭解釋模塊MI,那麼您可以使用:m + M1 *MI M3M1M2納入到普通方式的範圍內,並將MI納入範圍的特殊方式。

爲了完整,不過,import語法確實爲我們提供了三件事:m不會:

  1. 合格的進口。能夠執行import qualified Data.Map as M並使用M.lookup要比執行Data.Map.lookup或遭受模糊性錯誤要好得多。 (請注意,所安裝的每個軟件包都可在GHCi中獲得完全限定,因此單獨購買import qualified Module並不會產生任何影響。)

  2. 導入列表。即使我有從Data.MapM合格的功能,我仍然可以做import Data.Map (Map)只是使類型範圍不合格。

  3. 進口hiding。與上面相反;也許我正在寫我自己的排序程序,所以我可以做import Data.List hiding (sort)

您還可以檢出§2.4.5, "What's really in scope at the prompt?", in the GHC (7.6) user's guide

+0

謝謝你的詳細解答;如果我還沒有標記線程「解決」,我會選擇它。 – planarian