2011-11-21 107 views
8

我想創建一個模塊,並將其加載到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中,因爲我得到了堆棧溢出的異常。

+0

讓我們看看你輸入到ghci中導致堆棧溢出異常。 – dave4420

+0

你是否想在你的系統上安裝這個模塊,以便它可以被許多程序使用[(使用Cabal)](http://www.haskell.org/cabal/users-guide/),或者你只是想在單個程序中使用它(您只需要將模塊放在與程序主模塊相同的目錄中)? – dave4420

+0

我在ghci上輸入: >:l Pkr.Element; >卡片4; > ***異常計算器(或類似的東西) 關於我想要的:我正在學習haskell,我想用模塊來增加代碼的模塊性。我想在我的系統上安裝這個模塊,所以我可以重新使用我的軟件包的模塊。 – optimusfrenk

回答

15

您的粘貼與代碼混淆;也許它應該是這樣:http://hpaste.org/54363(在底部注意,從hlint的建議。)下面的步驟是發展的一個簡單的方法,但我會覺得揭露最相關的因素:

  • 重命名模塊爲更明智Poker.Elements,將其保存爲Elements.hs

  • 製作名爲poker與命名的子目錄Poker

  • 一個目錄移動到Elements.hspoker/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庫工具。沒什麼更簡單的。

  • cdpoker如果你不存在。

  • 運行cabal init。答案都是顯而易見的。你正在製作一個圖書館,屬於遊戲。

  • 編輯新poker.cabal文件 - cabal init不能告訴你使用的是什麼包。
    其實,你只使用PreludeData.Char這是在base,所以延長Build-depends線這樣看:

    Build-depends:  base > 2 
    

    結果將是這樣的:http://hpaste.org/54364(如果缺少任何其他依賴,這將與下一個命令出現)

  • 你的目錄現在有這樣的結構:

    -- poker -- poker.cabal 
          | 
          -- Poker  -- Elements.hs 
    
  • 因此,你現在擁有一個雕刻,可建造,確實可以hackage的包裝。鍵入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 - 一個在未來的目錄--imports Poker.Elements,因爲很可能,然後重建它也使用撲克的Elements您更先進的理念。)

  • 如果添加新模塊或從新軟件包導入模塊,請在相關行poker.cabal中指定。如果你忘了,cabal install會禮貌提醒您,當您嘗試重建做到這一點...

  • 上傳poker包GitHub的或補丁標籤或darcsden。完善後,將其上傳至hackage。請注意,即使在github或patch-tag上,它也屬於'hackaged'宇宙。如果您從Hackage上的fancier軟件包中導入模塊,那麼當您的存儲庫中的人git clonedarcs getcabal install將從hackage.haskell.org獲得正確的軟件包。

+1

我應該補充一點,如果你經歷了一次宗教轉換,並希望擺脫你曾經編寫過撲克軟件包的所有證據,請執行'ghc-pkg unregister poker-0.1'來讓ghc忘記 - 它會提醒你首先處理'texas-holdem-0.1',如果它存在 - 和'rm〜/ .cabal/lib/poker-0.1'來殺死已編譯的庫本身,那麼我猜'rm -r ../ poker'來擺脫你所在的目錄:) – applicative

+0

現在'cabal'提供了沙箱,這個答案應該可能會提到它們。 – Jubobs