2013-06-21 15 views
28

Ho un modulo Haskell e mi piacerebbe che esportasse tutti gli oggetti dichiarati nel suo file ad eccezione di una funzione specifica local_func.Haskell: nascondi le funzioni specifiche nelle esportazioni del modulo?

Esiste un modo più semplice per raggiungere questo obiettivo se non scrivendo una lista di esportazione elencando esplicitamente tutte le altre dichiarazioni (e mantenendo attentamente questo elenco aggiornato per l'eternità)?

In altre parole, mi piacerebbe un analogo di import MyModule hiding (local_func), ma specificato nel modulo di esportazione piuttosto che al momento dell'importazione.

risposta

26

Per quanto ne so, al momento non esiste un modo per farlo.

Quello che di solito faccio è avere un modulo centrale che riesporta le cose importanti come un modo conveniente per importare tutto ciò che è necessario senza nascondere nulla nei moduli che definiscono queste cose (che in alcuni casi - probabilmente si non lo prevedi! - rende più facile per i tuoi utenti modificare le cose nel tuo modulo).

Per fare questo uso la seguente sintassi:

-- |Convenient import module 
module Foo.Import (module All) where 

-- Import what you want to export 
import Foo.Stuff as All hiding (local_func) 
-- You can import several modules into the same namespace for this trick! 
-- For example if using your module also requires 'decode' from "Data.Aeson" you can do 
import Data.Aeson as All (decode) 

Ora avete comodamente esportati queste cose.

+3

Ottimo consiglio: "che in alcuni casi - che probabilmente non prevedi! - rende più facile per gli utenti modificare le cose nel tuo modulo": Sì! Questo è un problema comune nella mia esperienza, e quando un modulo impacchettato in cabala è stato "bloccato" con una lista di esportazione eccessivamente restrittiva, non conosco soluzioni migliori rispetto alla modifica e alla reinstallazione del pacchetto, che è fastidioso. – ntc2

5

Sfortunatamente no.

Si potrebbe immaginare una piccola aggiunta sintattica che consentirebbe il tipo di cosa che stai chiedendo. Al momento è possibile scrivere:

module M (module M) where 

foo = quux 

quux = 1+2 

È possibile esportare esplicitamente l'intero modulo. Ma supponiamo di dover aggiungere la sintassi in modo tale che fosse possibile nasconderlo da quel modulo. Quindi saremo in grado di scrivere così:

module M (module M hiding (quux)) where 

foo = quux 

quux = 1+2 
Problemi correlati