2016-02-12 6 views
5

Ich habe mich entschieden, meine eigene Prelude für ein größeres Projekt (mit einigen Bibliotheken und einigen ausführbaren Dateien) zu verwenden. Das Prelude exportiert einige Teilfunktionen nicht und exportiert einige allgemeine Funktionen (d. H. Von Control.Monad usw.). Ich kämpfe jedoch mit dem Weg, wie es geht. Ich habe versucht:Wie Sie Ihre 'Firma' korrekt definieren Prelude

  1. Verwendung base-noprelude. Erstellen Sie Prelude.hs in Modul my-common-module.

  2. Gleich wie oben, aber in der my-common-module erstellen My.Prelude stattdessen. In jedem anderen Modul ein Verzeichnis ‚Vorspiel‘ erstellen, es in hs-source-dirs Kabale Abschnitt setzen, erstellen Sie eine Datei prelude/Prelude.hs mit import My.Prelude

Das Problem ist, dass in 1) Ich kann nicht nur ghci laufen, wie ich es widersprüchliche bekommen base und my-common-module. In 2) ghci funktioniert, cabal repl irgendwie nicht, wie es auf mysteriöse Weise mit 'versucht, Modul' Prelude '(Präludium/Prelude.hs) zu verwenden, die nicht geladen ist'. Außerdem scheint base-noprelude nicht ghcjs, die ich für einen Teil des Projekts (Code-Sharing) verwenden möchte.

Es scheint mir der einzige Weg ist zur Zeit jede einzelne Datei zu starten mit:

import Prelude() 
import My.Prelude 

oder

{-# LANGUAGE NoImplicitPrelude #-} -- or extensions: NoImplicitPrelude in .cabal 
... 
import My.Prelude 

Die ‚Erweiterungen: NoImplicitPrelude‘ Option für mich am besten ist, als es erfordert Jede zu importierende Datei My.Prelude andernfalls wird es nicht funktionieren. Fehle ich eine offensichtliche Möglichkeit, die benutzerdefinierte Prelude erreichen und gleichzeitig mit cabal repl und ghcjs arbeiten würde?

Update: Base-Noprelude arbeitet mit GHCJS, wenn ich den Reexport von GHC.Event manuell entferne.

Update: Ok, ich habe etwas Zeit damit verbracht und hätte mehr ausgeben sollen. Es scheint mir, dass 1) der richtige Weg ist. cabal repl funktioniert (Danke Yuras), Ghci muss mit ghci -hide-package base geladen werden und funktioniert auch.

+0

Ich glaube nicht, dass es eine Möglichkeit gibt, das zu tun (ich habe mich bemüht). Das Problem mit dem Versuch, das Modul "Prelude" zu verwenden, wird [hier] gemeldet (https://ghc.haskell.org/trac/ghc/ticket/10920). – Yuras

+0

Können Sie ein vollständiges Beispiel von 1) teilen, das funktioniert? Weil es für mich nicht funktioniert :( Und ich bin mir jetzt sicher, wo ich Ihrer geholfen habe :) – Yuras

+2

Ich habe ein separates Kabal-Projekt namens 'base-myprelude' erstellt. Dies definiert einige Dinge und exportiert 'Prelude.hs' (ich musste einige' NoImplicitPrelude' in einigen Submodulen verwenden, da es dazu neigte, sich zu kreisen). Dann habe ich mein eigenes Projekt, "mein Projekt", das in den Kabalen von "base-noprelude, base-myprelude" abhängt. Das Projekt, an dem ich arbeite, ist nicht öffentlich, daher kann ich Sie nicht auf ein Repo hinweisen. Update: 'cabal repl' funktioniert nicht in' base-myprelude', sondern funktioniert in 'my-project', wenn Sie das fragen. – ondra

Antwort

3

landete ich mit diesem Setup auf, die zu funktionieren scheint:

my-prelude
  • erstellen ein spezielles Paket. Dieses Paket exportiert die Prelude, kann andere Module enthalten, kann es auf base abhängen. Möglicherweise müssen Sie in einigen Modulen {-# LANGUAGE NoImplicitPrelude #-} verwenden, um zirkuläre Abhängigkeiten zu vermeiden. Z.B. Möglicherweise möchten Sie, dass einige verwaiste Instanzen von Ihrer benutzerdefinierten Prelude in separaten Dateien (z. B. Orphans.Lib_aeson) definiert und exportiert werden, diese Dateien benötigen die NoImplicitPrelude.

  • In Ihrem Hauptprojekt ändern Bibliotheken usw. die Abhängigkeiten in cabal von base zu base-noprelude, my-prelude.

Was funktioniert:

  • cabal repl
  • GHCI/runghc funktioniert, aber Sie müssen es mit ghci -hide-package base beginnen; sonst wird es Konflikte zwischen base und my-prelude

Was nicht funktioniert:

  • cabal repl im my-prelude Paket.
Verwandte Themen