Sto scrivendo un piccolo compilatore Haskell e voglio implementare il maggior numero possibile di Haskell 2010. Il mio compilatore può analizzare un modulo, ma il completamento di moduli per un programma sembra essere un compito non banale. Ho fatto alcuni esempi di, ma, moduli Haskell forse validi difficili:Risoluzione del caso del modulo Haskell Importazioni ed esportazioni
module F(G.x) where
import F as G
x = 2
Qui il modulo F
esportazioni G.x
, ma G.x
è lo stesso di F.x
, quindi modulo F
esportazioni x
se, e solo se, esporta x
.
module A(a) where
import B(a)
a = 2
module B(a) where
import A(a)
In questo esempio, per risolvere le esportazioni del modulo A
compilatore deve verificare se a
importato dalla B
è la stessa della dichiarata a = 2
, ma B
esportazioni a
se, e solo se, A
esportazioni a
.
module A(f) where
import B(f)
module B(f) where
import A(f)
Durante modulo A
risolvere, il may've compilatore presume che f
importato da B
esiste, il che implica che le esportazioni A
f
, quindi B
possono importare ed esportare A(f)
f
. L'unico problema è che non esiste uno f
definito :).
module A(module X) where
import A as X
import B as X
import C as X
a = 2
module B(module C, C.b) where
import C
b = 3
module C(module C)
import B as C
c = 4
Qui, le esportazioni module
causa che le liste di esportazione sono dipendenti l'uno dall'altro e su se stessi.
Tutti questi esempi devono essere Haskell validi, come definito dalle specifiche Haskell 2010.
Voglio chiedere se c'è qualche idea su come implementare correttamente e completamente i moduli Haskell?
Si supponga che un modulo contiene solo (semplici) variabile binding, import
s (possibilmente con as
o qualified
), e l'elenco delle esportazioni di variabili eventualmente qualificati e module ...
abbreviazioni. L'algoritmo deve essere in grado di:
- calcolo lista finito di variabili esportate di ogni modulo
- collegamento ogni variabile esportati in suo legame
- collegamento ogni variabile (forse qualificato) utilizzato in ogni modulo per il suo legame
Wow, grazie, non ho nemmeno sperato che in realtà ci siano documenti e librerie che si occupano di questo problema :) –