Piszę (w zasadzie mój pierwszy) duży program w Haskell i próbuję rozbić mój program na moduły, aby łatwiej było go utrzymać. W Haskell nazwy modułów wydają się zależne od struktury katalogów. Jest to całkowicie w porządku, dopóki nie będę musiał osadzić kolejnej warstwy struktury katalogów dla programu. Podam bardzo prosty przykład poniżej:Lepszy sposób wstawiania katalogów w modułach Haskella
Powiedzmy, że zaczynamy od programu Haskell o następującej strukturze katalogów.
- nazwy w [nawiasach kwadratowych] reprezentują katalogów
- nazwy w {klamrami} reprezentują moduły,
- nazwy w (normalnych nawiasach) stanowią nazwy pliku związany wewnątrz modułów
[src]
- (Main.hs) {Main}
- (PRBS.hs) {PRBS}
- [Hardware]
- (DataDef.hs) {Hardware.DataDef}
- (ShiftRegister.hs) {Hardware.ShiftRegister}
To wszystko w porządku. Mogę importować wszystko, co chcę, gdzie tylko chcę. Jednak teraz, że chcę, aby utworzyć kolejny poziom abstrakcji, tak:
[src]
- (Main.hs) {Main}
- [Firmware]
- (PRBS.hs) {Firmware.PRBS}
- [Hardware]
- (DataDef.hs) {Firmware.Hardware.DataDef}
- (ShiftRegister.hs) {Firmware.Hardware.ShiftRegister}
Wskazówka teraz, że nazwy wszystkich modułów w Komputery zmieniły. Muszę teraz zmienić nazwy modułów w każdym pliku i we wszystkich innych plikach, w których pliki są importowane. Trzy pliki, które pokazałem w jednym przykładzie. Jeśli struktura katalogów kończy się setkami plików z dziesiątkami wbudowanych katalogów, może to uniemożliwić utrzymanie kodu. Ponadto, jeśli w którymkolwiek momencie chcę skopiować katalog (i jego podkatalogi w określonym miejscu w bieżącym systemie katalogowym), muszę znaleźć wszystkie poprzednie katalogi, które się przed nim znajdują, i ręcznie zmienić nazwy modułów w każdym z nich. plik.
Ponieważ Haskell jest używany w kilku dużych projektach, jestem pewien, że czegoś tu brakuje. Każda pomoc w wydostaniu mnie z tego bagna będzie bardzo doceniona!
nie wiem narzędzia lub podejścia, które działa wokół tego, ale wygląda na to, że będzie być zabawnym małym programem do pisania, aby zaktualizować nazwy modułów rekursywnie, gdy zmienisz strukturę w ten sposób. – bheklilr
Ha ha, myślę, że twoja definicja _little_ właśnie spowodowała zakłócenie Mocy. – ssm
Dla specyficzności: tak to jest w GHC, ale nie w Haskell jako całości. Specyfikacja nie mówi w ogóle, jak kompilator powinien znaleźć moduły. Podejrzewam, że dobrze zrobiona łata, która rozszerza możliwości wyszukiwania GHC, byłaby akceptowana ... ale pamiętaj, aby poprosić o komentarze przed rozpoczęciem hakowania, ponieważ jest to z pewnością coś, co zostało wcześniej omówione i jest dużo do zapamiętania w dobrym projekt. –