2015-10-02 13 views
9

Poiché le cose cambiano così velocemente, ho postato questa domanda, quindi spero che il modo concordato dalla comunità per avviare un progetto Haskell possa essere chiarito. Immaginate Ho due progetti distinti:Qual è il flusso di lavoro standard aggiornato per la creazione di progetti Haskell?

  • progetto # 1: Square, la libreria che piazze numeri. No deps.

    -- Square.hs 
    
    module Square where 
    
    square :: Num a => a -> a 
    square x = x * x 
    
  • progetto # 2: Hypotenuse, la biblioteca e eseguibile che trova il lato più lungo di un triangolo rettangolo. Dipende # 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 
    

Partendo da un computer con GHC 7.10.2, Pila e Cabal installato, e una singola directory, ~/OrganizeMe, contenente ~/OrganizeMe/Square.hs, ~/OrganizeMe/Hypotenuse.hs e ~/OrganizeMe/Main.hs, come presentato sopra - cos'è un set completo di comandi unix che un esperto Haskeller avrebbe usato per architettare quei progetti? Che comprende:

  1. Organizzare l'albero delle directory di tali progetti;

  2. configurazione Stack/Cabal/etc (e git, opzionalmente);

  3. costruzione/installazione locale;

  4. pubblicazione a Hackage/Stackage.

+0

Ho letto l'intera documentazione per Stack e alcuni tutorial Cabal. Ora conosco molte funzionalità, ma non so ancora come dovrebbero essere organizzati gli alberi delle directory. Ho bisogno di una directory per lo stack e più sottodirectory per i progetti, ognuno con un file '.cabal'? O cosa invece? Come posso collegare i progetti locali di importazione da entrambi? Un esempio solido di speranza può chiarire queste e altre domande. – MaiaVictor

+0

Stack/Stackage è bello. ha un supporto commerciale e tutto –

+1

Sul mio cellulare senza molto tempo, ma hai la giusta idea. Una sottodirectory per libreria, ciascuna con un file cabal, e fa riferimento a ogni dir dal file stack.yaml. Il repository wai fornisce un solido esempio di questo –

risposta

4

Questa non è una risposta completa, non si avvia con i tuoi OrganizeMe directory (ci sono alcuni errori nel codice) e non include la pubblicazione di Hackage/Stackage. Comincio con una directory stackenv per contenere entrambi i pacchetti, ma è possibile farlo in modo abbastanza diverso, naturalmente.

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 

Spero che questo aiuti.

+0

Woops. Avrei dovuto compilare il programma prima di postare la domanda. Mi dispiace per quello Questo mi sembra ragionevole, aspetterò più voti come segno di consenso. Grazie. – MaiaVictor

+0

Personalmente, raccomanderei di avere le directory 'lib' e' bin' (o simili) sotto 'hypotenuse'. In questo modo puoi usare 'hs-source-dirs' per assicurarti che il modulo' Hypotenuse' che importi nell'eseguibile provenga dal pacchetto 'hypotenuse' piuttosto che dal' Hypotenuse.hs' locale, che riduce il tempo di compilazione . –

+0

@DanielWagner: non sono sicuro di aver capito. Normalmente ho il mio codice in una directory 'src /' solo per l'organizzazione. Se si importa 'Hypotenuse' da' Hypotenuse.hs', viene compilato solo se lo si modifica, giusto? E lo stesso vale se lo imponi da un pacchetto nello stack? Qual è la differenza concettuale tra l'importazione da 'hypotenuse' o' Hypotenuse.hs'? –

Problemi correlati