20

2 つの .hs ファイルがあります。1 つは新しい型宣言を含み、もう 1 つはそれを使用します。

最初の.hs:

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

秒.hs:

module second () where
    import first 

second.hs を実行すると、first と second の両方のモジュールが問題なくロードされます。

しかし、:typeHaskellプラットフォームでSを書くと、次のエラーが表示されます

範囲外: データ コンストラクター 'S'

注:確かに各モジュールにはいくつかの機能がありますが、簡潔にするためにスキップしています

4

2 に答える 2

31
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 (S, SetType(..))

トップレベルをインデントすることもできます。

module Second where

    import First

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

しかし、それは醜いものであり、インデントを簡単に数えないためにエラーが発生する可能性があります。

于 2012-11-20T20:50:19.317 に答える
3
  • モジュール名は大文字で始まります-Haskellでは大文字と小文字が区別されます
  • コードを左マージンに並べます-Haskellではレイアウトが重要です。
  • 括弧内のビットはエクスポートリストです。すべての関数をエクスポートする場合、またはエクスポートするすべてのものをそこに入れる場合は、このリストを見逃してください。

First.hs

module First where

type S = SetType
data SetType = S[Integer] 

Second.hs

module Second where
import First
于 2012-11-20T20:50:29.800 に答える