我想创建一个模块,并将其加载到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”的问题,因为我得到了堆栈溢出的异常。
答案 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.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.Char
和base
,因此请将Build-depends
行扩展为:
Build-depends: base > 2
结果将如下所示:http://hpaste.org/54364(如果您缺少任何其他依赖项,则会出现下一个命令。)
您的目录现在具有以下结构:
-- poker -- poker.cabal
|
-- Poker -- Elements.hs
您现在拥有一个阴谋,可构建,实际上可以破解的包裹。输入cabal install
,然后输入cabal clean
。 cabal
工具管理包的配置,编译,安装和注册。 (默认情况下,编译的库将存放在隐藏目录$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 clone
或darcs get
您的存储库时,cabal install
将从hackage.haskell.org获取正确的软件包。