2012-11-20 95 views
13

我有兩個名爲.hs文件:一個包含新型減速,而另一個使用它不在範圍內的數據構造

first.hs:

module first() where 
    type S = SetType 
    data SetType = S[Integer] 

second.hs:

module second() where 
    import first 

當我運行second.hs時,兩個模塊第一個,第二個都加載得很好 但是,當我在Haskell平臺上編寫:type S時,出現以下錯誤

Not in scope : data constructor 'S' 

注:有每個模塊可以肯定在某些功能,我只是跳過它 的問題作出澄清

回答

17
module first() where 

在現實中假設模塊名稱以大寫字母開頭,因爲它必須,空出口列表 - () - 表示該模塊不會導出任何內容,因此First中定義的內容不在Second的範圍內。

完全省去導出列表導出所有頂級綁定,或列出導出的實體導出列表

module First (S, SetType(..)) where 

(在(..)出口也SetType的構造函數,如果沒有,只有類型會被出口)。

與應用,

module Second where 

import First 

foo :: SetType 
foo = S [1 .. 10] 

您也可以縮進頂層,

module Second where 

    import First 

    foo :: SetType 
    foo = S [1 .. 10] 

但那是醜陋的,人們可以得到應有的輕鬆計數錯誤的縮進錯誤。

+0

是的,它顆星的大寫字母(我只是忘了在這裏寫這種方式) 哪裏寫導入行呢? – Shimaa

+0

是的,否則不會編譯。 –

+0

哪裏寫導入第一行,這樣它的數據類型在Second的範圍內? – Shimaa

2
  • 模塊的名字開始與資本 - Haskell是區分大小寫
  • 行了你的代碼在左旁 - 佈局是非常重要的在Haskell。
  • 括號中的位是導出列表 - 如果要導出所有函數或將所有要導出的函數放在其中,則將其忽略。

First.hs

module First where 

type S = SetType 
data SetType = S[Integer] 

Second.hs

module Second where 
import First 
相關問題