2011-11-21 56 views
8

我想创建一个模块,并将其加载到haskell库中。我可以使用haskell平台的工具与Ubuntu 11或Windows 7一起工作。这是我的模块:创建并安装自己的模块

module Pkr.Element(..) where 

import Char 

data Card = Card Int deriving (Eq) 

seme :: Card -> Int 
seme (Card x) = mod (div x 13) 4 

label :: Card -> Int 
label (Card x) = mod x 13 

instance Ord Card where 
(>) x y  |ix == iy  = False 
     |ix == 0  = True 
     |iy == 0  = False 
     | otherwise  = (ix > iy) 
     where 
     ix = label x 
     iy = label y 

instance Show Card where 
show :: Card -> String 
show card =  strI(label card) : strS(seme card) :[] 
where 
strI x | (x == 0) = 'A' 
    | (x == 12) = 'K' 
    | (x == 11) = 'Q' 
    | (x == 10) = 'J' 
    | (x == 9) = 'T' 
    | otherwise = chr (49+x) 
strS y | (y == 0) = 'h' 
    | (y == 1) = 'c' 
    | (y == 2) = 'd' 
    | (y == 3) = 's' 

data Category = Null | HighCard | Copple | TwoCopple | 
     Tris | Straight | Flush | FullHouse | 
     Poker | StraightFlush deriving (Show, Eq, Ord) 

type Cards = [Card] 
data Rank = Rank Category Cards Cards deriving (Eq, Ord, Show) 

我也有一些问题,“显示”在ghci中,因为我得到了堆栈溢出的异常。

+0

让我们看看你输入到ghci中导致堆栈溢出异常。 – dave4420

+0

你是否想在你的系统上安装这个模块,以便它可以被许多程序使用[(使用Cabal)](http://www.haskell.org/cabal/users-guide/),或者你只是想在单个程序中使用它(您只需要将模块放在与程序主模块相同的目录中)? – dave4420

+0

我在ghci上输入: >:l Pkr.Element; >卡片4; > ***异常计算器(或类似的东西) 关于我想要的:我正在学习haskell,我想用模块来增加代码的模块性。我想在我的系统上安装这个模块,所以我可以重新使用我的软件包的模块。 – optimusfrenk

回答

15

您的粘贴与代码混淆;也许它应该是这样:http://hpaste.org/54363(在底部注意,从hlint的建议。)下面的步骤是发展的一个简单的方法,但我会觉得揭露最相关的因素:

  • 重命名模块为更明智Poker.Elements,将其保存为Elements.hs

  • 制作名为poker与命名的子目录Poker

  • 一个目录移动到Elements.hspoker/Poker。现在它的分层名称,Poker.Elements是有道理的。您的目录结构看起来如此:

    -- poker -- Poker -- Elements.hs 
    
  • poker现已组织正常。类型ghci Poker/Elements.hs从那里ghci会知道如何在一个更复杂的结构处理任何其他Poker.x.y.z模块就好说了这样一句:

    -- poker -- Poker -- Internal -- Guts.hs (i.e.Poker.Internal.Guts)   
            | 
            -- Elements.hs (i.e. Poker.Elements) 
    

但我们的想法是建立并与cabal安装poker库工具。没什么更简单的。

  • cdpoker如果你不存在。

  • 运行cabal init。答案都是显而易见的。你正在制作一个图书馆,属于游戏。

  • 编辑新poker.cabal文件 - cabal init不能告诉你使用的是什么包。
    其实,你只使用PreludeData.Char这是在base,所以延长Build-depends线这样看:

    Build-depends:  base > 2 
    

    结果将是这样的:http://hpaste.org/54364(如果缺少任何其他依赖,这将与下一个命令出现)

  • 你的目录现在有这样的结构:

    -- poker -- poker.cabal 
          | 
          -- Poker  -- Elements.hs 
    
  • 因此,你现在拥有一个雕刻,可建造,确实可以hackage的包装。键入cabal install,然后cabal cleancabal工具管理包的配置,编译,安装和注册。(默认情况下,编译后的库将存放在隐藏目录$HOME/.cabal/lib/poker-0.1或与您的系统等效的内容中。)

  • 从您系统上的任何位置打开ghci;输入import Poker.Elements。请享用。如果您直接拨打ghc也不例外 - 例如,如果您使用ghc --make -O2 PokerCalculator.hs -o pokercalculator制作可执行文件,ghc现在将知道如何在没有进一步说明的情况下找到Poker.Elements

  • 测试您的定义。反映。烦恼。重新考虑。测试更多。看看quickcheck

  • 当您修改您的模块时,重建并重新安装cabal install。这会覆盖旧的安装poker-0.1,因为您仍然在调用它;但在这个最简单的情况下,没有其他软件包正在构建,所以结果是可取的。 (如果你的其他实验库,texas-holdem-0.1 - 一个在未来的目录--imports Poker.Elements,因为很可能,然后重建它也使用扑克的Elements您更先进的理念。)

  • 如果添加新模块或从新软件包导入模块,请在相关行poker.cabal中指定。如果你忘了,cabal install会礼貌提醒您,当您尝试重建做到这一点...

  • 上传poker包GitHub的或补丁标签或darcsden。完善后,将其上传至hackage。请注意,即使在github或patch-tag上,它也属于'hackaged'宇宙。如果您从Hackage上的fancier软件包中导入模块,那么当您的存储库中的人git clonedarcs getcabal install将从hackage.haskell.org获得正确的软件包。

+1

我应该补充一点,如果你经历了一次宗教转换,并希望摆脱你曾经编写过扑克软件包的所有证据,请执行'ghc-pkg unregister poker-0.1'来让ghc忘记 - 它会提醒你首先处理'texas-holdem-0.1',如果它存在 - 和'rm〜/ .cabal/lib/poker-0.1'来杀死已编译的库本身,那么我猜'rm -r ../ poker'来摆脱你所在的目录:) – applicative

+0

现在'cabal'提供了沙箱,这个答案应该可能会提到它们。 – Jubobs