Sök…


Syntax

  • modul Namn vart - exportera alla namn som deklarerats i den här filen

  • modul Namn (functionOne, Type (..)) där - endast exportera functionOne, Type och Type's konstruktörer

  • importmodul - importera alla modulens exporterade namn

  • importera kvalificerad modul som MN - kvalificerad import

  • importmodul (justThisFunction) - importera bara vissa namn från en modul

  • importmodul gömmer sig (funktionsnamn, typ) - importera alla namn från en modul utom funktionens namn och typ

Anmärkningar

Haskell har stöd för moduler:

  • en modul kan exportera alla, eller en delmängd av dess medlemstyper och funktioner

  • en modul kan "exportera" namn som den importerade från andra moduler

I konsumentens slut på en modul kan man:

  • importera alla, eller en delmängd av modulmedlemmar

  • dölja importen av en viss medlem eller uppsättning medlemmar

haskell.org har ett bra kapitel om moduldefinition.

Definiera din egen modul

Om vi har en fil som heter Business.hs kan vi definiera en Business som kan import , som så:

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

En djupare hierarki är naturligtvis möjligt; se exempel på hierarkiska modulnamn .

Exportera konstruktörer

För att exportera typen och alla dess konstruktörer måste man använda följande syntax:

module X (Person (..)) where

Så för följande definitioner på toppnivå i en fil som heter People.hs :

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

isFoe Foe = True
isFoe _   = False

Denna moduldeklaration högst upp:

module People (Person (..)) where

skulle bara exportera Person och dess konstruktörer Friend and Foe .

Om exportlistan som följer modulens nyckelord utelämnas, kommer alla namn som är bundna på den översta nivån i modulen att exporteras:

module People where

skulle exportera Person , dess konstruktörer och isFoe funktionen.

Importera specifika medlemmar i en modul

Haskell stöder import av en delmängd av objekt från en modul.

import qualified Data.Stream (map) as D

skulle bara importera map från Data.Stream , och samtal till den här funktionen kräver D. .:

D.map odd [1..]

annars kompilatorn kommer att försöka använda Prelude 's map

Dölja import

Prelude definierar ofta funktioner vars namn används någon annanstans. Om du inte döljer sådan import (eller använder kvalificerad import där det inträffar konflikter) orsakar kompilationsfel.

Data.Stream definierar funktioner som heter map , head och tail som normalt kolliderar med de som definieras i Prelude. Vi kan dölja importen från Prelude genom att hiding :

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

I verkligheten kräver det för mycket kod för att dölja Prelude-sammanstötningar så här, så du skulle i själva verket använda en qualified import av Data.Stream istället.

Kvalificerande import

När flera moduler definierar samma funktioner med namn klagar kompilatorn. I sådana fall (eller för att förbättra läsbarheten) kan vi använda en qualified import:

import qualified Data.Stream as D

Nu kan vi förhindra tvetydighetskompilatorfel när vi använder map , som definieras i Prelude och Data.Stream :

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

Det är också möjligt att importera en modul med endast de sammanstötande namnen som är kvalificerade via import Data.Text as T , vilket gör att man kan ha Text istället för T.Text etc.

Hierarkiska modulnamn

Modulernas namn följer filsystemets hierarkiska struktur. Med följande fillayout:

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

modulhuvudena ser ut så här:

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

Anteckna det:

  • modulnamnet baseras på sökvägen för filen som förklarar modulen
  • Mappar kan dela ett namn med en modul, vilket ger en naturligt hierarkisk namnstruktur till moduler


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow