haskell - Riesportare qualificato?



syntax module (2)

supponiamo di avere due moduli come

module Foo.A where

foo = 42

e

module Foo.B where

foo = 12

e vuoi scrivere un super modulo

module Foo (
      module Foo.A
    , module Foo.B
    ) where

import Foo.A
import Foo.B

che ri-esporta quei moduli, si otterrebbe un conflitto di nomi.

C'è una soluzione per questo?


Buona domanda. Il rapporto Haskell affronta questo :

Gli elenchi di esportazioni sono cumulativi: l'insieme di entità esportate da una lista di esportazione è l'unione delle entità esportate dai singoli elementi della lista.

[...]

I nomi non qualificati delle entità esportate da un modulo devono essere tutti distinti (all'interno del rispettivo spazio dei nomi).

Secondo la mia limitata conoscenza di Haskell, direi che non è possibile.


Fondamentalmente, no. Questa è stata una richiesta di vecchia data da parte di persone come gli autori di Gtk2hs. Gtk2hs ha una gerarchia di moduli molto ampia in cui potrebbe avere senso per entrambi:

  • Utilizzare lo stesso nome in diversi moduli (ad es. NewButton in Graphics.UI.Gtk.Buttons.Button e Graphics.UI.Gtk.Buttons.CheckButton)
  • Fornire all'utente l'utilità di importare tutti questi moduli con una singola dichiarazione di importazione

Per ora, se vuoi riesportare più moduli insieme, tutto quello che puoi fare è:

  • Evita di riutilizzare i nomi nei moduli che desideri riesportare
  • Se del caso, utilizzare le classi di tipi per consentire di utilizzare lo stesso nome per diversi scopi




module