由于事情变化如此之快,我已经发布了这个问题,所以希望能够澄清社群同意的启动Haskell项目的方式。想象一下,我有两个独立的项目:
项目#1 :Square,正方形数字的库。没有代表。
-- Square.hs
module Square where
square :: Num a => a -> a
square x = x * x
项目#2 :斜边,库和可执行文件,找到直角三角形的最长边。取决于#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
从安装了GHC 7.10.2,Stack和Cabal的计算机以及包含~/OrganizeMe
,~/OrganizeMe/Square.hs
和~/OrganizeMe/Hypotenuse.hs
的单个目录~/OrganizeMe/Main.hs
开始上面 - 经验丰富的Haskeller用来构建这些项目的一整套unix命令是什么?包括:
组织这些项目的目录树;
配置Stack
/ Cabal
/ etc
(和git
,可选);
在本地构建/安装;
发布到Hackage
/ Stackage
。
答案 0 :(得分: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
希望这有帮助。