2013-06-21 10 views
28

Ich habe ein Haskell-Modul, und ich möchte es alle in seiner Datei deklarierten Objekte mit Ausnahme einer bestimmten Funktion local_func exportieren.Haskell: bestimmte Funktion (en) in Modulexporten ausblenden?

Gibt es einen saubereren Weg, dies zu erreichen, als eine Exportliste zu schreiben, die explizit alle anderen Deklarationen auflistet (und diese Liste sorgfältig für alle Ewigkeit auf dem neuesten Stand hält)?

Mit anderen Worten, ich möchte ein Analogon von import MyModule hiding (local_func), sondern im Export-Modul eher, dass zum Zeitpunkt des Imports.

Antwort

26

Soweit ich weiß, gibt es derzeit keinen Weg, dies zu tun.

Was ich normalerweise tun, ist mit einem zentralen Modul, das wichtige Dinge wieder exportiert als eine bequeme Möglichkeit, alles zu importieren, was notwendig ist, während nichts in den Modulen zu verbergen, die diese Dinge definieren (was in einigen Fällen - dass Sie wahrscheinlich wird nicht voraussehen! - macht es Ihren Benutzern einfacher, Dinge in Ihrem Modul zu ändern).

diese Verwendung die folgende Syntax zu tun:

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

Sie haben nun diese Dinge bequem exportiert.

+3

Toller Rat: "die in einigen Fällen - die Sie wahrscheinlich nicht vorhersehen! - macht es Ihren Benutzern einfacher, Dinge in Ihrem Modul zu ändern": Ja! Dies ist ein häufiges Problem meiner Erfahrung nach, und wenn ein cabal-verpacktes Modul mit einer übermäßig restriktiven Exportliste "abgesperrt" wurde, kenne ich keine bessere Lösung als das Bearbeiten und Neuinstallieren des Pakets, was ärgerlich ist. – ntc2

5

Leider nicht.

Man könnte sich eine kleine syntaktische Addition vorstellen, die das zulässt, was man verlangt. Jetzt ist es möglich zu schreiben:

module M (module M) where 

foo = quux 

quux = 1+2 

Sie können das gesamte Modul explizit exportieren. Aber nehmen wir an, wir würden eine Syntax hinzufügen, so dass es möglich wäre, sich vor diesem Modul zu verstecken. Dann könnten wir so schreiben:

module M (module M hiding (quux)) where 

foo = quux 

quux = 1+2