2013-10-23 11 views
6

Tranne da potenziali conflitti di nomi - che può essere ottenuto intorno con altri mezzi - non v'è alcun beneficio per importare solo le parti da un modulo che è necessario:vantaggio di importare parti specifiche di un modulo Haskell

import SomeModule (x, y, z) 

... versi solo l'importazione di tutti di esso, che è terser e più facile da mantenere:

import SomeModule 

farebbe il binario più piccolo, per esempio?

+1

idk se renderebbe un file binario più piccolo ma può essere utile se esistono collisioni di funzioni per funzioni che non sono necessarie. Invece di importare un modulo qualificato e poi digitare ciò che hai importato più e più volte. Puoi semplicemente importare le parti che ti servono e non importarle qualificate. – DiegoNolan

risposta

6

No, è solo allo scopo di prevenire conflitti di nomi. L'altro meccanismo per prevenire conflitti di nomi, ovvero import qualified, produce un codice più dettagliato (meno leggibile).

Non renderebbe il file binario più piccolo - si consideri che le funzioni in un dato modulo si riferiscono tutte l'una all'altra, di solito, quindi devono essere compilate insieme.

11

Le collisioni di nomi e l'ottimizzazione della dimensione binaria sono solo due dei vantaggi che si possono ottenere. In effetti, è una buona pratica identificare sempre ciò che vuoi ottenere dal mondo esterno del tuo codice. Quindi, ogni volta che le persone guardano il tuo codice, sapranno esattamente che cosa richiede il tuo codice.

Questo ti dà anche una buona possibilità di creare soluzioni di simulazione per test, dal momento che puoi lavorare attraverso l'elenco delle importazioni e scrivere mocking per loro.

Sfortunatamente, in Haskell le istanze di classe del tipo non sono così facili. Vengono importati implicitamente e quindi possono creare conflitti, inoltre possono rendere più difficile il mocking, poiché non c'è modo di specificare solo istanze di classe specifiche. Speriamo che questo possa essere risolto nelle versioni future di Haskell.

UPDATE

I benifits ho elencato sopra (manutenzione del codice e test di scherno) non sono limitati a Haskell. In realtà, è anche una pratica comune in Java, come so. In Java puoi semplicemente importare una singola classe, o anche una singola variabile statica/metodo. Sfortunatamente, ancora non è possibile importare in modo selettivo le funzioni dei membri.

+1

I secondo questa risposta. Pensa alle persone che vengono più tardi e prova a leggere il tuo codice; se il tuo modulo usa una funzione chiamata 'frobnicate', come fanno a sapere da quale dei moduli importati proviene? Possono grep o Hoogle, ma forse ci sono più moduli che definiscono le funzioni di quel nome, che poi devono fare riferimenti incrociati con le importazioni, ecc. È meglio essere più specifici nelle importazioni, anche se non è un problema e regola veloce –

+3

Se possono aprire quel modulo in GHCi allora ': i frobnicate' di solito ti dirà il file in cui è stato trovato. Potrebbe essere possibile farlo anche attraverso ghc-mod. –

+0

@ J.Abrahamson Cosa succede se * non è possibile * aprire il modulo in GHCi perché la compilazione fallisce con un messaggio su 'frobnicate' non definito? L'importazione esplicita ti dice da dove doveva venire *, che può essere di vitale importanza quando stai raccogliendo il vecchio codice che una volta funzionava, ma che deve essere inoltrato. – Ben

Problemi correlati