创建并安装自己的模块

时间:2011-11-21 09:57:51

标签: haskell

我想创建一个模块,并将其加载到haskell库中。我可以使用haskell-platform的工具与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中也遇到了“show”的问题,因为我得到了堆栈溢出的异常。

1 个答案:

答案 0 :(得分:15)

您的粘贴正在弄乱代码;也许它看起来应该如此:http://hpaste.org/54363(请注意底部hlint的建议。)以下步骤是一个简单的开发方法,但我认为会暴露大部分相关因素:

  • 将模块重命名为更合理的Poker.Elements,将其另存为Elements.hs

  • 创建一个名为poker的目录,其子目录名为Poker

  • Elements.hs移至poker/Poker。现在它的分层名称Poker.Elements是有意义的。您的目录结构如下:

    -- poker -- Poker -- Elements.hs 
    
  • poker现已正确组织。从那里输入ghci Poker/Elements.hsghci将知道如何处理更复杂结构中的任何其他Poker.x.y.z模块,比如说这个:

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

但我们的想法是使用poker工具构建和安装cabal库。没什么比这更简单了。

  • cd如果您不在,请poker

  • 运行cabal init。答案都很明显。您正在建立一个与游戏有关的图书馆。

  • 修改新的poker.cabal文件 - cabal init无法确定您使用的是哪种套餐。
    实际上,您只使用Prelude中的Data.Charbase,因此请将Build-depends行扩展为:

    Build-depends:       base > 2
    

    结果将如下所示:http://hpaste.org/54364(如果您缺少任何其他依赖项,则会出现下一个命令。)

  • 您的目录现在具有以下结构:

    -- poker   -- poker.cabal
              |
               -- Poker      -- Elements.hs
    
  • 您现在拥有一个阴谋,可构建,实际上可以破解的包裹。输入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 - 下一个目录中的那个 - 尽可能导入Poker.Elements,那么也可以重建它以使用关于Elements的更高级的想法扑克。)

  • 如果您添加新模块或从新软件包导入模块,请在poker.cabal的相关行中指定这些模块。如果您忘记了,cabal install会在您尝试重建时礼貌地提醒您这样做...

  • 将您的poker包上传到github或patch-tag或darcsden。完善之后,将其上传到hackage。请注意,即使在github或patch-tag上,它也属于'hackaged'宇宙。如果您从Hackage上的发烧友软件包导入模块,那么当人们git clonedarcs get您的存储库时,cabal install将从hackage.haskell.org获取正确的软件包。