2016-02-12 26 views
5

Ho deciso di utilizzare il mio Prelude per un progetto più grande (contenente alcune librerie e alcuni file eseguibili). Il preludio non esporta alcune funzioni parziali ed esporta alcune funzioni comuni (ad esempio da Control.Monad ecc.). Tuttavia, sto combattendo con il modo in cui farlo. Ho provato:Come definire correttamente il tuo Preludio "azienda"

  1. utilizzare base-noprelude. Creare Prelude.hs nel modulo my-common-module.

  2. Come sopra, ma nello my-common-module creare My.Prelude invece. In ogni altro modulo creare una directory 'preludio', metterlo in hs-source-dirs sezione cabala, creare un file prelude/Prelude.hs con import My.Prelude

Il problema è che in 1) non posso correre ghci, mentre ottengo in conflitto base e my-common-module. In 2) ghci funziona, cabal repl in qualche modo non come fallisce misteriosamente con 'tentativo di usare il modulo' Prelude '(preludio/Prelude.hs) che non è caricato'. Inoltre, non sembra chepiaccia lo ghcjs, che voglio utilizzare per parte del progetto (condivisione del codice).

Mi sembra l'unico modo attualmente è quello di iniziare ogni singolo file con:

import Prelude() 
import My.Prelude 

o

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

Le 'estensioni: NoImplicitPrelude' opzione mi sembra meglio in quanto richiede ogni file da importare My.Prelude altrimenti non funzionerà. Mi manca un modo ovvio per ottenere Preludio personalizzato e allo stesso tempo lavorare con cabal repl e ghcjs?

Aggiornamento: base-noprelude funziona con GHCJS quando rimuovo manualmente il reexport di GHC.Event.

Aggiornamento: Ok, ho passato un po 'di tempo con questo e avrei dovuto spendere di più. Mi sembra che 1) sia la strada giusta da percorrere. cabal repl funziona (grazie Yuras), ghci deve essere caricato con ghci -hide-package base e funziona anche.

+0

Non credo che ci sia un modo per farlo (ci ho provato sodo). Il problema con 'tentativo di usare il modulo 'Preludio'' è riportato [qui] (https://ghc.haskell.org/trac/ghc/ticket/10920). – Yuras

+0

Potresti condividere un esempio completo di 1) che funziona? Perché non funziona per me :( E ora sono sicuro di dove ho aiutato il tuo :) – Yuras

+2

Ho creato un progetto di cabala separato chiamato base-myprelude'. Questo definisce alcune cose ed esporta 'Prelude.hs' (dovevo usare alcuni' NoImplicitPrelude' in alcuni sottomoduli in quanto tendeva a circolare). Poi ho il mio progetto, 'mio-progetto' che nella cabala dipende da 'base-noprelude, base-miaprelude'. Il progetto a cui sto lavorando non è pubblico, quindi non posso indicarti un repo. Aggiornamento: 'cabal repl' non funziona in' base-myprelude', ma funziona in 'my-project', se è quello che stai chiedendo. – ondra

risposta

3

Ho finito con questa configurazione che sembra funzionare:

  • Creare un pacchetto speciale my-prelude. Questo pacchetto esporta lo Prelude, può contenere altri moduli, può dipendere da base. Potrebbe essere necessario utilizzare {-# LANGUAGE NoImplicitPrelude #-} in alcuni moduli per evitare dipendenze circolari. Per esempio. potresti voler avere alcune istanze orfane definite ed esportate dal tuo file personalizzato Prelude in file separati (ad esempio Orphans.Lib_aeson), questi file richiedono lo NoImplicitPrelude.

  • Nel progetto principale, le librerie ecc. Cambiano le dipendenze in cabale da base a base-noprelude, my-prelude.

Ciò che funziona:

  • cabal repl
  • ghci/opere runghc, ma si deve cominciare con ghci -hide-package base; altrimenti non ci sarà conflitto tra base e my-prelude

cosa non funziona:

  • cabal repl nel pacchetto my-prelude.
Problemi correlati