Haskell Language
Moduły
Szukaj…
Składnia
nazwa modułu gdzie - eksportuj wszystkie nazwy zadeklarowane w tym pliku
nazwa modułu (functionOne, Type (..)) gdzie - eksportuj tylko konstruktory functionOne, Type i Type
import Module - importuj wszystkie wyeksportowane nazwy Module
import kwalifikowany moduł jako MN - import kwalifikowany
import Module (justThisFunction) - importuj tylko niektóre nazwy z modułu
import Ukrywanie modułów (functionName, Type) - importuj wszystkie nazwy z modułu oprócz funkcji FunctionName and Type
Uwagi
Haskell obsługuje moduły:
moduł może eksportować wszystkie lub podzbiór swoich typów członków i funkcji
moduł może „ponownie eksportować” nazwy zaimportowane z innych modułów
Po stronie konsumenta modułu można:
zaimportuj wszystkie lub podzbiór elementów modułu
ukryj import określonego członka lub zestawu członków
haskell.org ma świetny rozdział na temat definicji modułów.
Definiowanie własnego modułu
Jeśli mamy plik o nazwie Business.hs
, możemy zdefiniować moduł Business
, który można import
, w następujący sposób:
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
Głębsza hierarchia jest oczywiście możliwa; zobacz przykład nazw hierarchicznych modułów .
Eksportowanie konstruktorów
Aby wyeksportować typ i wszystkie jego konstruktory, należy użyć następującej składni:
module X (Person (..)) where
Tak więc dla następujących definicji najwyższego poziomu w pliku o nazwie People.hs
:
data Person = Friend String | Foe deriving (Show, Eq, Ord)
isFoe Foe = True
isFoe _ = False
Ta deklaracja modułu u góry:
module People (Person (..)) where
eksportowałby tylko Person
i jej konstruktorów Friend
i Foe
.
Jeśli lista eksportu po słowie kluczowym modułu zostanie pominięta, wszystkie nazwy powiązane na najwyższym poziomie modułu zostaną wyeksportowane:
module People where
wyeksportuje Person
, jego konstruktorów i funkcję isFoe
.
Importowanie określonych członków modułu
Haskell obsługuje importowanie podzbioru elementów z modułu.
import qualified Data.Stream (map) as D
importowałby tylko map
z Data.Stream
, a wywołania tej funkcji wymagałyby D.
.:
D.map odd [1..]
w przeciwnym razie kompilator spróbuje użyć funkcji map
Prelude
.
Ukrywanie importu
Preludium często definiuje funkcje, których nazwy są używane gdzie indziej. Nie ukrycie takiego importu (lub użycie kwalifikowanego importu w przypadku kolizji) spowoduje błędy kompilacji.
Data.Stream
definiuje funkcje o nazwie map
, head
i tail
które normalnie Data.Stream
funkcjami zdefiniowanymi w Preludium. Możemy ukryć ten import przed Preludium za pomocą hiding
:
import Data.Stream -- everything from Data.Stream
import Prelude hiding (map, head, tail, scan, foldl, foldr, filter, dropWhile, take) -- etc
W rzeczywistości wymagałoby to zbyt dużej ilości kodu, aby ukryć takie Data.Stream
Preludium, więc zamiast tego Data.Stream
qualified
importu Data.Stream
.
Kwalifikujący się import
Gdy wiele modułów definiuje te same funkcje według nazwy, kompilator będzie narzekał. W takich przypadkach (lub w celu poprawy czytelności) możemy użyć qualified
importu:
import qualified Data.Stream as D
Teraz możemy zapobiec błędom kompilatora niejednoznaczności, gdy korzystamy z map
zdefiniowanej w Prelude
i Data.Stream
:
map (== 1) [1,2,3] -- will use Prelude.map
D.map (odd) (fromList [1..]) -- will use Data.Stream.map
Możliwe jest również zaimportowanie modułu, w którym tylko nazwy import Data.Text as T
są kwalifikowane poprzez import Data.Text as T
, co pozwala mieć Text
zamiast T.Text
itp.
Hierarchiczne nazwy modułów
Nazwy modułów są zgodne z hierarchiczną strukturą systemu plików. Z następującym układem pliku:
Foo/
├── Baz/
│ └── Quux.hs
└── Bar.hs
Foo.hs
Bar.hs
nagłówki modułów wyglądałyby tak:
-- 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
Uwaga:
- nazwa modułu jest oparta na ścieżce pliku deklarującego moduł
- Foldery mogą współdzielić nazwę z modułem, co nadaje modułom naturalnie hierarchiczną strukturę nazewnictwa