Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 创建并安装自己的模块_Haskell - Fatal编程技术网

Haskell 创建并安装自己的模块

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

我想创建一个模块,并将其加载到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 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--make-O2 Poker calculator.hs-o Poker calculator
    生成一个可执行文件,ghc现在将知道如何查找
    Poker.Elements
    ,而无需进一步说明

  • 测试你的定义。反思。烦恼重新考虑。测试更多。查看
    quickcheck

  • 修改模块时,请使用
    cabal install
    重建并重新安装。这将重写旧安装的
    poker-0.1
    ,您仍在调用它;但在这种最简单的情况下,没有其他包针对它构建,因此结果是令人满意的。(如果您的另一个实验库--
    texas-holdem-0.1
    ——下一个目录中的库--imports
    Poker.Elements
    ,很可能的话,那么也可以重新构建它,以使用您关于Poker的
    Elements
    的更高级的想法。)

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

  • 将您的
    poker
    软件包上载到github或补丁或DarcDen。当你完善了它,上传到hackage。请注意,即使在github或补丁标签上,它也属于“黑客”世界。如果您在Hackage上从fancier软件包导入模块,那么当人们
    git clone
    DARC获得您的存储库时,
    cabal install
    将从Hackage.haskell.org获得适合他们的软件包


向我们展示您在ghci中键入的导致堆栈溢出异常的内容。您是想在系统上安装此模块,使其可供多个程序使用,还是只想在单个程序中使用(只需将模块与程序的主模块放在同一目录中)?我在ghci上键入此内容:>:l Pkr.Element;>卡片4;>***关于我想要的异常stackoverflow(或类似的东西):我正在学习haskell,我想使用模块来增加代码的模块性。我想在我的系统上安装此模块,这样我就可以重复使用我的软件包中的模块。键入
: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