Haskell Language
モジュール
サーチ…
構文
module Nameここで、 - このファイルで宣言されているすべての名前をエクスポートする
module Name(functionOne、Type(..)) - functionOne、Type、およびTypeのコンストラクタのみをエクスポートします。
import Module - モジュールのエクスポートされた名前をすべてインポートする
MN修飾されたモジュールをインポートします。
importモジュール(justThisFunction) - 特定の名前のみをモジュールからインポートする
import module hiding(functionName、Type) - functionNameとType以外のモジュールからすべての名前をインポートする
備考
Haskellはモジュールをサポートしています:
モジュールはすべて、またはそのメンバータイプと関数のサブセットをエクスポートすることができます
モジュールは他のモジュールからインポートした名前を「再エクスポート」することができます
モジュールの消費者側では、次のことが可能です。
モジュールメンバーのすべて、またはサブセットをインポートする
特定のメンバーまたはメンバーのセットのインポートを隠す
haskell.orgにはモジュール定義に関する素晴らしい章があります。
独自のモジュールの定義
Business.hs
というファイルがある場合、 import
できるBusiness
モジュールを定義できます。次のようにします。
module Business (
Person (..), -- ^ Export the Person type and all its constructors and field names
employees -- ^ Export the employees function
) where
-- begin types, function definitions, etc
もちろん、より深い階層も可能です。 階層モジュール名の例を参照してください。
コンストラクタのエクスポート
型とそのすべてのコンストラクタをエクスポートするには、次の構文を使用する必要があります。
module X (Person (..)) where
したがって、 People.hs
というファイルの次のトップレベルの定義については、
data Person = Friend String | Foe deriving (Show, Eq, Ord)
isFoe Foe = True
isFoe _ = False
上のこのモジュール宣言:
module People (Person (..)) where
Person
とそのコンストラクタFriend
とFoe
だけをエクスポートします。
moduleキーワードに続くエクスポートリストを省略すると、モジュールの最上位レベルにバインドされたすべての名前がエクスポートされます。
module People where
Person
、そのコンストラクタ、およびisFoe
関数をisFoe
ます。
モジュールの特定のメンバーのインポート
Haskellは、モジュールから項目のサブセットをインポートすることをサポートしています。
import qualified Data.Stream (map) as D
Data.Stream
からmap
をインポートするだけで、この関数への呼び出しにはD.
が必要ですD.
D.map odd [1..]
それ以外の場合、コンパイラはPrelude
のmap
関数を使用しようとします。
輸入品を隠す
Preludeは、その名前が他の場所で使われている関数を定義することがよくあります。そのようなインポートを隠していない(または衝突が発生した修飾されたインポートを使用する)と、コンパイルエラーが発生します。
Data.Stream
はmap
、 head
、 tail
という名前の関数を定義し、通常はPreludeで定義されたものと衝突します。隠蔽を使用しhiding
Preludeからこれらのインポートを隠すことができます:
import Data.Stream -- everything from Data.Stream
import Prelude hiding (map, head, tail, scan, foldl, foldr, filter, dropWhile, take) -- etc
実際には、このようなPreludeのクラッシュを隠すにはあまりにも多くのコードが必要になるため、実際には代わりにData.Stream
qualified
インポートをData.Stream
ます。
適格輸入
複数のモジュールが同じ関数を名前で定義すると、コンパイラは不平を言います。そのような場合(または可読性を向上させるために)、私たちはqualified
インポートを使用することができます:
import qualified Data.Stream as D
Prelude
とData.Stream
定義されているmap
を使うと、あいまいさのコンパイラエラーを防ぐことができます:
map (== 1) [1,2,3] -- will use Prelude.map
D.map (odd) (fromList [1..]) -- will use Data.Stream.map
また、 T.Text
などの代わりにText
を持つことができるimport Data.Text as T
、 import Data.Text as T
介して修飾された衝突する名前だけを持つモジュールをインポートすることも可能T.Text
。
階層的なモジュール名
モジュールの名前は、ファイルシステムの階層構造に従います。次のファイルレイアウトを使用します。
Foo/
├── Baz/
│ └── Quux.hs
└── Bar.hs
Foo.hs
Bar.hs
モジュールヘッダーは次のようになります。
-- file Foo.hs
module Foo where
-- file Bar.hs
module Bar where
-- file Foo/Bar.hs
module Foo.Bar where
-- file Foo/Baz/Quux.hs
module Foo.Baz.Quux where
ご了承ください:
- モジュール名は、モジュールを宣言するファイルのパスに基づいています
- フォルダはモジュールと名前を共有することができます。モジュールには自然に階層的な命名構造が与えられます