Ricerca…


Sintassi

  • modulo Nome dove - esporta tutti i nomi dichiarati in questo file

  • nome modulo (functionOne, Type (..)) dove - esportare solo i costruttori functionOne, Type e Type

  • modulo di importazione: importa tutti i nomi esportati del modulo

  • importare Modulo qualificato come MN - importazione qualificata

  • import Module (justThisFunction) - importa solo determinati nomi da un modulo

  • import Module hiding (functionName, Type) - importa tutti i nomi da un modulo ad eccezione di functionName e Type

Osservazioni

Haskell ha il supporto per i moduli:

  • un modulo può esportare tutto, o un sottoinsieme dei suoi tipi di membri e funzioni

  • un modulo può "riesportare" i nomi importati da altri moduli

Alla fine del consumatore di un modulo, si può:

  • importa tutto, o un sottoinsieme di membri del modulo

  • nascondere le importazioni di un particolare membro o gruppo di membri

haskell.org ha un grande capitolo sulla definizione del modulo.

Definire il tuo modulo

Se abbiamo un file chiamato Business.hs , possiamo definire un modulo Business che può essere import , in questo modo:

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

Una gerarchia più profonda è ovviamente possibile; vedere l'esempio dei nomi dei moduli gerarchici .

Esportare costruttori

Per esportare il tipo e tutti i suoi costruttori, si deve usare la seguente sintassi:

module X (Person (..)) where

Pertanto, per le seguenti definizioni di livello superiore in un file denominato People.hs :

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

isFoe Foe = True
isFoe _   = False

Questa dichiarazione del modulo in alto:

module People (Person (..)) where

esporterebbe solo Person e i suoi costruttori Friend e Foe .

Se viene omessa la lista di esportazione che segue la parola chiave del modulo, verranno esportati tutti i nomi associati al livello più alto del modulo:

module People where

isFoe Person , i suoi costruttori e la funzione isFoe .

Importazione di membri specifici di un modulo

Haskell supporta l'importazione di un sottoinsieme di elementi da un modulo.

import qualified Data.Stream (map) as D

importerebbe solo la map da Data.Stream e le chiamate a questa funzione richiederebbero D. .:

D.map odd [1..]

altrimenti il ​​compilatore proverà ad usare la funzione map Prelude .

Nascondere le importazioni

Il preludio definisce spesso funzioni i cui nomi sono usati altrove. Non nascondendo tali importazioni (o utilizzando importazioni qualificate in cui si verificano conflitti) causerà errori di compilazione.

Data.Stream definisce le funzioni denominate map , head e tail che normalmente si scontrano con quelle definite in Prelude. Possiamo nascondere quelle importazioni da Prelude usando il hiding :

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

In realtà, richiederebbe un numero eccessivo di codice per nascondere le Data.Stream di Preludio in questo modo, quindi in effetti si utilizzerà invece un'importazione qualified di Data.Stream .

Importazioni qualificate

Quando più moduli definiscono le stesse funzioni per nome, il compilatore si lamenterà. In questi casi (o per migliorare la leggibilità), possiamo usare un'importazione qualified :

import qualified Data.Stream as D

Ora possiamo evitare errori del compilatore di ambiguità quando usiamo la map , che è definita in Prelude e Data.Stream :

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

È anche possibile importare un modulo con solo i nomi in conflitto che vengono qualificati tramite import Data.Text as T , che consente di avere Text anziché T.Text ecc.

Nomi dei moduli gerarchici

I nomi dei moduli seguono la struttura gerarchica del filesystem. Con il seguente layout di file:

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

le intestazioni del modulo sarebbero simili a questo:

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

Nota che:

  • il nome del modulo si basa sul percorso del file che dichiara il modulo
  • Le cartelle possono condividere un nome con un modulo, che dà una struttura di denominazione gerarchica ai moduli


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow