2011-11-21 18 views
8

Chcę utworzyć moduł i załadować go do biblioteki haskell. Mogę pracować z Ubuntu 11 lub Windows 7, używając narzędzi platformy haskell. To jest mój moduł:Tworzenie i instalowanie własnego modułu

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) 

Mam również problem z "show" w ghci, ponieważ dostaję wyjątek przepełnienia stosu.

+0

Pokaż nam, co wpisujesz w ghci, co powoduje wyjątek przepełnienia stosu. – dave4420

+0

Czy chcesz zainstalować ten moduł w swoim systemie, aby mógł być używany przez wiele programów [(użyj Cabal)] (http://www.haskell.org/cabal/users-guide/), czy po prostu chcesz używać go w jednym programie (wystarczy umieścić moduł w tym samym katalogu, co główny moduł programu)? – dave4420

+0

Piszę to na ghci: >: l Pkr.Element; > Karta 4; > *** wyjątek stackoverflow (lub coś podobnego) O czym chcę: uczę się haskell i chcę używać modułów do zwiększenia modułowości kodu. Chciałbym zainstalować ten moduł w moim systemie, więc mogę ponownie użyć modułów mojego pakietu. – optimusfrenk

Odpowiedz

15

Twoja pasta wkręca się w kod; Może powinno to wyglądać tak: http://hpaste.org/54363 (uwaga porady od hlint na dole). Następujące kroki są za pomocą prostego sposobu rozwoju, ale myślę wystawiać najbardziej istotnych czynników:

  • Zmień nazwę modułu do bardziej rozsądnego Poker.Elements, zapisać go jako Elements.hs

  • Dodać katalog o nazwie poker z podkatalogu Poker

  • Move Elements.hs do poker/Poker. Teraz jego hierarchiczna nazwa, Poker.Elements ma sens. Twoja struktura katalogów wygląda tak:

    -- poker -- Poker -- Elements.hs 
    
  • poker jest obecnie zorganizowana prawidłowo. Rodzaj ghci Poker/Elements.hs stamtąd i ghci będą wiedzieć, jak radzić sobie z innymi Poker.x.y.z modułów w bardziej skomplikowanej strukturze jak powiedzmy to jedno:

    -- poker -- Poker -- Internal -- Guts.hs (i.e.Poker.Internal.Guts)   
            | 
            -- Elements.hs (i.e. Poker.Elements) 
    

Ale naszym celem było zbudować i zainstalować bibliotekę poker z cabal narzędzie. Nic prostszego.

  • cd do poker jeśli nie istnieją.

  • Uruchom cabal init. Odpowiedzi będą oczywiste. Tworzysz bibliotekę odnoszącą się do Gier.

  • Edytuj swój nowy plik poker.cabal - cabal init nie może stwierdzić, jakich pakietów używasz.
    W rzeczywistości używasz tylko Prelude i Data.Char które są w base, więc przedłużyć linię Build-depends wyglądać tak:

    Build-depends:  base > 2 
    

    Wynik będzie wyglądać następująco: http://hpaste.org/54364 (Jeśli brakuje jakichkolwiek innych zależności, to wyjdzie z następnego polecenia)

  • Twój katalog ma teraz tę strukturę.

    -- poker -- poker.cabal 
          | 
          -- Poker  -- Elements.hs 
    
  • W ten sposób otrzymujesz kabalowy, gotowy do zbudowania pakiet, który jest w stanie poradzić sobie z hakowaniem. Wpisz cabal install, a następnie cabal clean. Narzędzie cabal zarządzało konfiguracją, kompilacją, instalacją i rejestracją pakietu.(Domyślnie skompilowana biblioteka zostanie zdeponowana w ukrytym katalogu $HOME/.cabal/lib/poker-0.1 lub odpowiedniku dla twojego systemu.)

  • Otwórz ghci z dowolnego miejsca w systemie; typ import Poker.Elements. Cieszyć się. Nie ma co innego, jeśli zadzwonisz bezpośrednio pod numer ghc - na przykład, jeśli utworzysz plik wykonywalny z ghc --make -O2 PokerCalculator.hs -o pokercalculator, ghc będzie teraz wiedział, jak znaleźć Poker.Elements bez dalszych instrukcji.

  • Sprawdź swoje definicje. Odzwierciedlić. Denerwować. Zrewidować. Przetestuj więcej. Zajrzyj do quickcheck.

  • Po zmodyfikowaniu modułu, przebuduj go i zainstaluj ponownie przy użyciu cabal install. Spowoduje to nadpisanie starej instalacji poker-0.1, ponieważ wciąż ją wywołujesz; ale w tym, najprostszym przypadku, żadne inne pakiety nie są budowane przeciwko niemu, więc wynik jest pożądany. (Jeśli inna biblioteka eksperymentalny texas-holdem-0.1 - jeden w następnym katalogu --imports Poker.Elements, co jest prawdopodobne, a następnie odbudować to też korzystać z bardziej zaawansowanych pomysłów o Elements pokera.)

  • Jeśli dodać nowe moduły lub moduły importu z nowych pakietów, należy je podać w odpowiednich wierszach: poker.cabal. Jeśli zapomnisz, cabal install grzecznie przypomni Ci o tym, kiedy spróbujesz odbudować ...

  • Załaduj swój pakiet poker do github lub patch-tag lub darcsden. Po udoskonaleniu załaduj go do hackage. Zauważ, że nawet na githubie lub patch-tagu należy do "hakowanego" wszechświata. Jeśli importujesz moduły z bardziej wyszukanych pakietów w Hackage, to kiedy ludzie git clone lub twoje repozytorium, cabal install dostanie odpowiednie pakiety dla nich z hackage.haskell.org.

+1

Powinienem dodać, że jeśli doświadczysz konwersji religijnej i chcesz pozbyć się wszystkich dowodów, że kiedykolwiek napisałeś pakiet pokerowy, zrób 'ghc-pkg wyrejestruj poker-0.1', aby zapomnieć o ghc - to ci przypomni aby poradzić sobie z 'texas-holdem-0.1' najpierw, jeśli istnieje - i' rm ~/.cabal/lib/poker-0.1', by zabić samą skompilowaną bibliotekę, to zgaduję, że 'rm -r ../ poker', aby pozbyć się katalogu, w którym jesteś :) – applicative

+0

Teraz, 'cabal' oferuje piaskownice, ta odpowiedź prawdopodobnie powinna o nich wspomnieć. – Jubobs