我想创建一个模块,并将其加载到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中的“show”也存在一些问题,因为我得到了堆栈溢出的异常。

最佳答案

您的粘贴使代码困惑了;也许看起来应该是这样: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.hs,然后ghci将知道如何以更复杂的结构来处理任何其他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,而无需进一步说明。
  • 测试您的定义。反射(reflect)。烦恼。重新考虑。测试更多。查看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获得适合他们的软件包。
  • 关于haskell - 创建并安装自己的模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8209976/

    10-11 08:46