Haskell 创建并安装自己的模块
我想创建一个模块,并将其加载到haskell库中。我可以使用haskell平台的工具使用Ubuntu11或Windows7。这是我的模块:Haskell 创建并安装自己的模块,haskell,Haskell,我想创建一个模块,并将其加载到haskell库中。我可以使用haskell平台的工具使用Ubuntu11或Windows7。这是我的模块: 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
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”也有一些问题,因为我遇到了堆栈溢出的异常情况。您的粘贴会弄乱代码;也许它看起来应该是这样的:(请注意底部的
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)
cabal
工具构建并安装poker
库。再简单不过了
进入cd
如果你不在那里poker
- 运行
。答案是显而易见的。您正在制作一个与游戏相关的库cabalinit
- 编辑新的
文件--poker.cabal
无法分辨您正在使用的软件包。cabal init
实际上,您只使用了
中的base
和Prelude
,因此扩展Data.Char
行以如下方式查看:Build dependens
结果如下所示:(如果缺少任何其他依赖项,将在下一个命令中出现。)Build-depends: base > 2
- 您的目录现在具有以下结构:
-- poker -- poker.cabal | -- Poker -- Elements.hs
- 因此,您现在有了一个Cabized、buildable、甚至hackage-able包。键入
,然后键入cabal install
。cabal clean
工具管理包的配置、编译、安装和注册。(默认情况下,编译后的库将存放在隐藏目录cabal
或系统的等效目录中。)$HOME/.cabal/lib/poker-0.1
- 从系统的任何位置打开
;键入ghci
。享受。如果您直接调用导入扑克元素
,也没什么不同——例如,如果您使用ghc
生成一个可执行文件,ghc现在将知道如何查找ghc--make-O2 Poker calculator.hs-o Poker calculator
,而无需进一步说明Poker.Elements
- 测试你的定义。反思。烦恼重新考虑。测试更多。查看
quickcheck
- 修改模块时,请使用
重建并重新安装。这将重写旧安装的cabal install
,您仍在调用它;但在这种最简单的情况下,没有其他包针对它构建,因此结果是令人满意的。(如果您的另一个实验库--poker-0.1
——下一个目录中的库--importstexas-holdem-0.1
,很可能的话,那么也可以重新构建它,以使用您关于Poker的Poker.Elements
的更高级的想法。)Elements
- 如果添加新模块或从新包导入模块,请在
的相关行中指定这些模块。如果您忘记了,poker.cabal
将礼貌地提醒您在尝试重建时执行此操作cabal install
- 将您的
软件包上载到github或补丁或DarcDen。当你完善了它,上传到hackage。请注意,即使在github或补丁标签上,它也属于“黑客”世界。如果您在Hackage上从fancier软件包导入模块,那么当人们poker
或git clone
DARC获得您的存储库时,
将从Hackage.haskell.org获得适合他们的软件包cabal install
:l Pkr/Element.hs
以获取子目录Pkr
中名为Elements.hs
的源文件。如果要调用已安装的模块,必须首先安装它——请参见下文;然后键入导入Pkr.Element或:m+Pkr.Element
。它们是完全不同的命令。请参见下文。如果文件保存为Elements.hs
,并且您位于包含该文件的目录中,则可以执行ghci Elements.hs
,或者如果您位于ghci
内部,则可以执行:l Elements.hs
。为此,文件声明模块是什么并不重要;你必须参考这个文件。一旦ghci
对其进行解释,它将显示它已导入Pkr.Element
或任何它被调用的内容,或者Main
如果它没有被调用任何内容。加载带有:l blah.hs
的文件是将模块导入ghci
的一种方法;另一种方法是:m+Pkr.Element
或导入Pkr.Element
,但这需要更多。再一次,请看下面。我也许应该补充一点,如果你经历了宗教皈依,并且想摆脱所有你曾经写过扑克包的证据,那么请做ghc pkg unregister poke