我遇到過一些包含特別奇怪的輸入的模塊。爲什麼在Haskell的導入中這些角落案例如何工作?他們做了什麼?
首先,我看到一個模塊A
,導入一個其他模塊作爲自己。例如:
-- module A.hs
module A where
import B as A -- ???
f = id
這是幹什麼的?爲什麼上面允許上述內容?
但是大多數的煩惱我是代碼實際上是這樣的:
module A where
import B as A -- Okay, assume this works...
import C as A -- ??? A is already defined!
f = id
爲什麼不能多於一個模塊具有相同名稱的進口?這實現了什麼? 我認爲這幾樣import
小號是不允許,也A Gentle Introduction to Haskell指出:
它是非法的導入具有相同名稱 到同一範圍內兩個不同的實體。
但是,這些進口工作正常。
module A (module A) where
總結,給出以下MWE:
-- A.hs
module A (module A) where
import B as A
import C as A
f = id
-- B.hs
module B where
g = id
-- C.hs
module C where
h = id
- 是進口採用的標準或這是一些bug然而,這錯誤我是出口模塊本身的其他奇怪的事情GHC?它看起來不像一個bug,但是我找不到任何可以解釋所有這些角落案例的參考。
- 取得的確切結果是什麼?我的意思是:哪些名稱是從
A
導入和/或導出的?
我從來沒有見過從本身導出模塊;那很有意思。所有其他情況下,不同導入中的名稱都是聯合的。例如。第一個例子:A.somethingInB引用B的版本,但是A.f引用A的版本(除非B也定義了f,那麼這是一個模糊性錯誤)。幸運的是,這可以簡單地概括爲:-) – luqui