簡體   English   中英

為什么Hackage將模塊鏈接到其他源文件?

[英]Why does Hackage link a module to a different source file?

我正在嘗試了解Hackage顯示的基本軟件包的結構。 https://en.wikibooks.org/wiki/Haskell/Modules之后,模塊名稱必須反映其來源的路徑; 引用以上內容:

文件的名稱是模塊的名稱加上.hs文件擴展名。 任何點“。” 模塊名稱中的“目錄”已更改。

以Data.List為例,這使我認為應該在路徑../Data/List.hs下包含一個源文件,然后包含

module Data.List where ...

(模導出列表)。

另一方面,如果我瀏覽Hackage上的Data.List模塊並單擊“#Source”鏈接,則會定向到各種不同模塊的源文件。 其中包括:GHC.Base,Data.OldList,Data.Foldable,GHC.List。

再次,第一手,我在基本軟件包的本地安裝中顯然包含一個../Data/List.hi接口文件。

因此,我的問題是:如何解釋差異? Hackage上真正展示了什么?

預先感謝您對此事的任何見解!

從模塊導入的名稱可以重新導出。 發生這種情況時,hadock會幫助您將名稱鏈接到名稱的原始來源,而不是重新導出模塊中的導入行。 它遵循您的間接性。 這就是您的情況。 因此,以(++) (Data.List的haddocks中的第一個函數)為例,代碼的結構如下:

 -- GHC/Base.hs
 module GHC.Base where
 (++) = ...

 -- Data/OldList.hs
 module Data.OldList ( (++) {- re-exports GHC.Base's (++) -}, ... ) where
 import GHC.Base -- brings (++) into scope

 -- Data/List.hs
 module Data.List ( (++), ... ) where
 import Data.OldList hiding ( ... {- does not mention (++) -} )

因此,您可以看到haddock實際上遵循了兩個鏈接: (++)是從Data.OldList導入的,甚至在那里也已重新導出。

編譯器也會仔細地跟蹤定義了名稱的原始模塊。 如果導入所有的Data.ListData.OldListGHC.Base ,您會發現您仍然可以使用(++)即使乍一看似乎(Data.List.++)(Data.OldList.++)(GHC.Base.++) 由於所有這三個實際最終都解析為(GHC.Base.++) ,因此沒有歧義。

暫無
暫無

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

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