2015-10-02 8 views
9

Da sich die Dinge so schnell ändern, habe ich diese Frage gestellt, damit hoffentlich der von der Community vereinbarte Weg, ein Haskell-Projekt zu starten, geklärt werden kann. Stellen Sie sich vor Ich habe zwei separate Projekte:Was ist der aktuelle Standardworkflow für den Bau von Haskell-Projekten?

  • Projekt # 1: Quadrat, die Bibliothek, die Quadrate Zahlen. Keine Depressionen.

    -- Square.hs 
    
    module Square where 
    
    square :: Num a => a -> a 
    square x = x * x 
    
  • Projekt # 2: Hypotenuse, die Bibliothek und die ausführbare Datei, die die längste Seite eines rechtwinkligen Dreiecks findet. Hängt davon ab, # 1:

    -- Hypotenuse.hs 
    
    module Hypotenuse where 
    
    import Square 
    
    hypotenuse :: Floating a => a -> a -> a 
    hypotenuse x y = sqrt $ square x + square y 
    

    ,

    -- Main.hs 
    
    import System.Environment 
    import Hypotenuse 
    
    main = do 
        [x,y] <- fmap (map read) getArgs 
        print $ hypotenuse x y 
    

Beginnend mit einem Computer mit GHC 7.10.2, Stapel und Cabal installiert, und ein einzelnes Verzeichnis, ~/OrganizeMe, mit ~/OrganizeMe/Square.hs, ~/OrganizeMe/Hypotenuse.hs und ~/OrganizeMe/Main.hs, wie oben dargestellt - Was ist ein kompletter Satz von Unix-Befehlen, den ein erfahrener Haskeller verwenden würde, um diese Projekte zu entwerfen? Dazu gehören:

  1. den Verzeichnisbaum dieser Projekte organisieren;

  2. Konfigurieren Stack/Cabal/etc (git und gegebenenfalls);

  3. sie lokal aufbauen/installieren;

  4. Veröffentlichung zu Hackage/Stackage.

+0

Ich habe die gesamte Dokumentation für Stack und einige Cabal Tutorials gelesen. Jetzt weiß ich über viele Funktionen, aber ich weiß immer noch nicht, wie die Verzeichnisbäume organisiert sein sollen. Benötige ich ein Verzeichnis für den Stapel und mehrere Unterverzeichnisse für Projekte, jedes mit einer '.cabal' Datei? Oder was stattdessen? Wie kann ich lokale Projekte miteinander verknüpfen? Ein hoffnungsvolles Beispiel kann diese und andere Fragen klären. – MaiaVictor

+0

Stack/Stackage ist nett. hat kommerziellen Rückhalt und alles. –

+1

Auf meinem Handy ohne viel Zeit, aber Sie haben die richtige Idee. Ein Unterverzeichnis pro Bibliothek mit jeweils einer Cabal-Datei und Verweis auf jedes Verzeichnis aus der Datei stack.yaml. Die Wai Repo bietet ein solides Beispiel für diese –

Antwort

4

Dies ist keine vollständige Antwort, es beginnt nicht mit Ihren OrganizeMe Verzeichnissen (es gibt einige Fehler in Ihrem Code ist) und es beinhaltet nicht zu Hackage/Stackage veröffentlichen. Ich beginne mit einem Verzeichnis stackenv, um beide Pakete zu enthalten, aber Sie könnten das natürlich ganz anders machen.

mkdir stackenv && cd stackenv/ 
mkdir square && cd square 
vim Square.hs # The file you describe without the x in the type of square 
cabal init # Go through the questions and choose "library" 
stack init 
cd ../ && mkdir hypotenuse && cd hypotenuse/ 
vim Hypotenuse.hs # The file you describe 
vim Main.hs # The file you describe but importing Hypotenuse 
cabal init # Go through the questions... "executable" this time 
stack init 
vim hypotenuse.cabal # add "square" or chosen package name to build-depends 
vim stack.yaml # add "- '../square/'" below packages 
stack install 
hypotenuse 3 4 # works because ~/.local/bin is in my PATH 

Hoffe, das hilft.

+0

Woops. Ich hätte das Programm vor dem Stellen der Frage kompilieren sollen. Das tut mir leid. Das erscheint mir vernünftig, ich warte auf mehr Upvotes als Zeichen des Konsens. Vielen Dank. – MaiaVictor

+0

Ich persönlich würde empfehlen, 'lib' und' bin' Verzeichnisse (oder ähnliches) unter 'hypotenuse' zu ​​haben. Auf diese Weise können Sie 'hs-source-dirs' verwenden, um sicherzustellen, dass das' Hypotenuse' Modul, das Sie in die ausführbare Datei importieren, aus dem 'hypotenuse' Paket stammt und nicht aus der lokalen' Hypotenuse.hs', was die Kompilierzeit verkürzt . –

+0

@DanielWagner: Ich bin mir nicht sicher, ob ich das verstehe. Normalerweise habe ich meinen Code in einem 'src /' dir nur für die Organisation. Wenn Sie 'Hypotenuse' aus' Hypotenuse.hs' importieren, wird es nur kompiliert, wenn Sie es ändern, oder? Und das gleiche gilt, wenn Sie es aus einem Paket im Stapel importieren? Was ist der konzeptionelle Unterschied zwischen dem Import von Hypotenuse oder Hypotenuse.hs? –