2015-10-02 14 views
9

事が急速に変わるので、私はこの質問を投稿しました。うまくいけば、Haskellプロジェクトを開始するコミュニティ合意された方法を明確にすることができます。Haskellプロジェクトを構築するための最新の標準ワークフローは何ですか?

  • プロジェクト#1:スクエア、正方形の数字ライブラリ私は2つの別々のプロジェクトを持っている想像してみてください。デセップはありません。

    -- Square.hs 
    
    module Square where 
    
    square :: Num a => a -> a 
    square x = x * x 
    
  • プロジェクト#2:直角三角形の最長辺を見つけ斜辺、ライブラリと実行可能。

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

は、GHC 7.10.2とコンピュータ、スタックと陰謀団がインストールされ、単一のディレクトリを皮切り~/OrganizeMe~/OrganizeMe/Square.hsを含む、~/OrganizeMe/Hypotenuse.hs

-- Hypotenuse.hs 

module Hypotenuse where 

import Square 

hypotenuse :: Floating a => a -> a -> a 
hypotenuse x y = sqrt $ square x + square y 

と:第1位に依存します~/OrganizeMe/Main.hs、上記のとおり - 経験豊かなHaskellerがこれらのプロジェクトを設計するのに使う完全なunixコマンドは何ですか?以下を含みます:

  1. これらのプロジェクトのディレクトリツリーを整理します。 (必要に応じて、及びgitStack/Cabal/etcを構成

  2. ビルドしてローカルにインストールします。

  3. 公開Hackage/Stackage

+0

私はStackといくつかのCabalチュートリアルの全ドキュメントを読んでいます。今私は多くの機能について知っていますが、ディレクトリツリーがどのように整理されているのかまだ分かりません。 '.cabal'ファイルを持つプロジェクト用に、スタック用と複数のサブディレクトリ用に1つのディレクトリが必要ですか?それとも代わりに?私はどのように相互にインポートローカルプロジェクトをリンクすることができますか?希望の実例は、これらの質問や他の質問を明確にすることができます。 – MaiaVictor

+0

Stack/Stackageがいいです。商業的裏書とすべてを持っています。 –

+1

私のモバイルでは時間がかかりませんが、あなたは正しい考えを持っています。 1つのライブラリごとに1つのサブディレクトリがあり、それぞれがカバールファイルを持ち、stack.yamlファイルから各ディレクトリを参照します。ワイレポはこれの実例を提供します –

答えて

4

これは完全な答えではない、それは(あなたのコードに多少の誤差があります)あなたOrganizeMeディレクトリと起動しない、それはHackage/Stackageへの公開は含まれません。私は両方のパッケージを含むディレクトリstackenvから始めますが、これはもちろんかなり異なっています。

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 

これが役立ちます。

+0

Woops。私は質問を投稿する前にプログラムをコンパイルしておくべきだった。申し訳ありません。これは私には合理的です、私はコンセンサスの兆候としてより多くのupvotesを待つでしょう。ありがとうございました。 – MaiaVictor

+0

個人的には、 'hypotenuse'の下に' lib'と 'bin'ディレクトリ(またはそれに類するもの)を置くことをお勧めします。このようにして、 'hs-source-dirs'を使って、実行可能ファイルにインポートする' Hypotenuse'モジュールがローカルの 'Hypotenuse.hs'からではなく、' hypotenuse'パッケージから来ていることを確認します。 。 –

+0

@DanielWagner:分かりません。私は通常、組織のためだけに 'src /'ディレクトリに自分のコードを持っています。 'Hypotenuse'を' Hypotenuse.hs'からインポートすると、それを変更した場合のみコンパイルされます。スタック内のパッケージからインポートすると同じことが成り立ちますか? 'hypotenuse'または' Hypotenuse.hs'からのインポートの概念の違いは何ですか? –

関連する問題