サーチ…


構文

  • 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とそのコンストラクタFriendFoeだけをエクスポートします。

moduleキーワードに続くエクスポートリストを省略すると、モジュールの最上位レベルにバインドされたすべての名前がエクスポートされます。

module People where

Person 、そのコンストラクタ、およびisFoe関数をisFoeます。

モジュールの特定のメンバーのインポート

Haskellは、モジュールから項目のサブセットをインポートすることをサポートしています。

import qualified Data.Stream (map) as D

Data.Streamからmapをインポートするだけで、この関数への呼び出しにはD.が必要ですD.

D.map odd [1..]

それ以外の場合、コンパイラはPreludemap関数を使用しようとします。

輸入品を隠す

Preludeは、その名前が他の場所で使われている関数を定義することがよくあります。そのようなインポートを隠していない(または衝突が発生した修飾されたインポートを使用する)と、コンパイルエラーが発生します。

Data.Streammapheadtailという名前の関数を定義し、通常は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

PreludeData.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 Timport 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

ご了承ください:

  • モジュール名は、モジュールを宣言するファイルのパスに基づいています
  • フォルダはモジュールと名前を共有することができます。モジュールには自然に階層的な命名構造が与えられます


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow