Zoeken…


Syntaxis

  • module Naam waar - exporteer alle namen die in dit bestand zijn gedeclareerd

  • module Naam (functionOne, Type (..)) waar - exporteer alleen de constructors van functionOne, Type en Type

  • import Module - importeer alle geëxporteerde namen van modules

  • gekwalificeerde module importeren als MN - gekwalificeerde import

  • importmodule (justThisFunction) - importeer alleen bepaalde namen uit een module

  • module verbergen (functionName, Type) - importeer alle namen uit een module behalve functionName en Type

Opmerkingen

Haskell biedt ondersteuning voor modules:

  • een module kan alle, of een subset van de ledentypes en -functies exporteren

  • een module kan namen die het uit andere modules heeft geïmporteerd opnieuw "exporteren"

Aan de consumentzijde van een module kan men:

  • importeer alles of een subset van module-leden

  • invoer van een bepaald lid of een set leden verbergen

haskell.org heeft een geweldig hoofdstuk over moduledefinitie .

Uw eigen module definiëren

Als we een bestand met de naam Business.hs , kunnen we een Business module definiëren die als volgt kan worden import :

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

Een diepere hiërarchie is natuurlijk mogelijk; zie het voorbeeld van de hiërarchische modulenamen .

Constructeurs exporteren

Om het type en al zijn constructors te exporteren, moet men de volgende syntaxis gebruiken:

module X (Person (..)) where

Dus voor de volgende definities op het hoogste niveau in een bestand met de naam People.hs :

data Person = Friend String | Foe deriving (Show, Eq, Ord)

isFoe Foe = True
isFoe _   = False

Deze module verklaring bovenaan:

module People (Person (..)) where

zou alleen Person en zijn constructeurs Friend and Foe exporteren.

Als de exportlijst na het trefwoord van de module wordt weggelaten, worden alle namen op het hoogste niveau van de module geëxporteerd:

module People where

zou Person , zijn constructeurs en de isFoe functie isFoe .

Specifieke leden van een module importeren

Haskell ondersteunt het importeren van een subset items uit een module.

import qualified Data.Stream (map) as D

zou alleen de map importeren uit Data.Stream en voor deze functie is D. vereist:

D.map odd [1..]

anders zal de compiler probeert te gebruiken Prelude 's map functie.

Invoer verbergen

Prelude definieert vaak functies waarvan de namen elders worden gebruikt. Het niet verbergen van dergelijke invoer (of het gebruik van gekwalificeerde invoer waar botsingen optreden) zal compilatiefouten veroorzaken.

Data.Stream definieert functies met de naam map , head en tail die normaal gesproken botsen met die gedefinieerd in Prelude. We kunnen die invoer uit Prelude hiding met behulp van hiding :

import Data.Stream -- everything from Data.Stream
import Prelude hiding (map, head, tail, scan, foldl, foldr, filter, dropWhile, take) -- etc

In werkelijkheid zou het teveel code vereisen om Prelude-botsingen als deze te verbergen, dus zou u in plaats daarvan een qualified import van Data.Stream gebruiken.

In aanmerking komende importen

Wanneer meerdere modules dezelfde functies op naam definiëren, zal de compiler klagen. In dergelijke gevallen (of om de leesbaarheid te verbeteren) kunnen we een qualified import gebruiken:

import qualified Data.Stream as D

Nu kunnen we fouten bij het compileren van ambiguïteit voorkomen wanneer we map , die is gedefinieerd in Prelude en Data.Stream :

map (== 1) [1,2,3] -- will use Prelude.map
D.map (odd) (fromList [1..]) -- will use Data.Stream.map

Het is ook mogelijk om een module te importeren waarbij alleen de botsende namen worden gekwalificeerd via import Data.Text as T , waardoor men Text kan hebben in plaats van T.Text enz.

Hiërarchische modulenamen

De namen van modules volgen de hiërarchische structuur van het bestandssysteem. Met de volgende bestandsindeling:

Foo/
├── Baz/
│   └── Quux.hs
└── Bar.hs
Foo.hs
Bar.hs

de module headers zouden er zo uitzien:

-- 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

Let daar op:

  • de modulenaam is gebaseerd op het pad van het bestand dat de module aangeeft
  • Mappen kunnen een naam delen met een module, wat modules een natuurlijk hiërarchische naamstructuur geeft


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow