2016-02-12 11 views
5

Zdecydowałem się użyć własnego Prelude dla większego projektu (zawierającego niektóre biblioteki i niektóre pliki wykonywalne). Preludium nie eksportuje niektórych funkcji częściowych i eksportuje niektóre wspólne funkcje (tj. Od Control.Monad itd.). Jednak walczę z tym, jak to zrobić. Próbowałem:Jak poprawnie zdefiniować preludium "firmy"

  1. użyć base-noprelude. Utwórz Prelude.hs w module my-common-module.

  2. Tak samo jak powyżej, ale zamiast tego w my-common-module utworzono My.Prelude. W każdym innym modułem utworzyć katalogu „Preludium”, umieścić go w hs-source-dirs cabal sekcji, należy utworzyć plik prelude/Prelude.hs z import My.Prelude

Problem polega na tym, że w 1) Nie mogę uruchomić ghci, jak otrzymuję sprzeczne base i my-common-module. W 2) ghci działa, cabal repl w jakiś sposób nie zawodzi w tajemniczy sposób "próbując użyć modułu" Prelude "(prelude/Prelude.hs), który nie jest załadowany". Dodatkowo, base-noprelude nie wydaje się lubić ghcjs, który chcę użyć dla części projektu (dzielenie kodu).

Wydaje mi się, że jedynym sposobem jest obecnie na rozpoczęcie każdego i każdy plik z:

import Prelude() 
import My.Prelude 

lub

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

do „rozszerzenia: NoImplicitPrelude” opcja wydaje mi się najlepiej, gdyż wymaga każdy plik do importowania My.Prelude inaczej nie będzie działać. Czy brakuje mi jakiegoś oczywistego sposobu osiągnięcia Preludium niestandardowego, a jednocześnie pracy z cabal repl i ghcjs?

Aktualizacja: base-noprelude działa z GHCJS, gdy ręcznie usuwam reexport z GHC.Event.

Aktualizacja: Ok, spędziłem z tym trochę czasu i powinienem był wydać więcej. Wydaje mi się, że 1) jest właściwą drogą. cabal repl działa (dzięki Yuras), ghci musi być załadowany z ghci -hide-package base i działa też.

+0

Nie sądzę, że istnieje sposób, aby to zrobić (próbowałem mocno). Problem z 'próbą użycia modułu 'Prelude'' jest zgłaszany [tutaj] (https://ghc.haskell.org/trac/ghc/ticket/10920). – Yuras

+0

Czy możesz udostępnić pełny przykład 1), który działa? Ponieważ to nie działa dla mnie :( I jestem teraz pewien, gdzie pomogłem twojemu :) – Yuras

+2

Stworzyłem oddzielny projekt kabalowy o nazwie 'base-myprelude'. To definiuje pewne rzeczy i wyeksportuje 'Prelude.hs' (musiałem użyć jakiegoś' NoImplicitPrelude' w niektórych submodułach, które zwykle krążyły). Potem mam swój własny projekt, "mój-projekt", który w cabal zależy od 'base-noprelude, base-myprelude'. Projekt, nad którym pracuję, nie jest publiczny, więc nie mogę wskazać ci repozytorium. Aktualizacja: 'cabal repl' nie działa w' base-myprelude', ale działa w 'my-project', jeśli o to pytasz. – ondra

Odpowiedz

3

skończyło się tym układzie, który wydaje się działać:

  • utworzyć specjalny pakiet my-prelude. Ten pakiet eksportuje Prelude, może zawierać inne moduły, może być zależny od base. W niektórych modułach może być konieczne użycie {-# LANGUAGE NoImplicitPrelude #-}, aby uniknąć zależności cyklicznych. Na przykład. możesz chcieć zdefiniować i oskarżyć instancje osierocone przez niestandardowe Prelude w oddzielnych plikach (na przykład Orphans.Lib_aeson), pliki te muszą być NoImplicitPrelude.

  • W głównym projekcie biblioteki itp. Zmieniają zależności w cabal z base na base-noprelude, my-prelude.

Co działa:

  • cabal repl
  • ghci/robót runghc, ale trzeba zacząć go ghci -hide-package base; w przeciwnym razie nie będzie konflikt między base i my-prelude

Co nie działa:

  • cabal repl w pakiecie my-prelude.
Powiązane problemy