2011-11-21 12 views
8

मैं एक मॉड्यूल बनाना चाहता हूं, और इसे हैकेल लाइब्रेरी में लोड करना चाहता हूं। मैं हैकसेल-प्लेटफ़ॉर्म के टूल का उपयोग करके उबंटू 11 या विंडोज 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 पर टाइप करता हूं: >: एल Pkr.Element; > कार्ड 4; > *** अपवाद स्टैकओवरफ्लो (या कुछ समान) मैं जो चाहता हूं उसके बारे में: मैं हैकेल सीख रहा हूं और मैं कोड की मॉड्यूलरिटी बढ़ाने के लिए मॉड्यूल का उपयोग करना चाहता हूं। मैं इस मॉड्यूल को अपने सिस्टम पर स्थापित करना चाहता हूं, इसलिए मैं अपने पैकेज के मॉड्यूल का पुनः उपयोग कर सकता हूं। – optimusfrenk

उत्तर

15

आपका पेस्ट कोड के साथ गड़बड़ कर रहा है; शायद यह इसलिए दिखना चाहिए: http://hpaste.org/54363 (तल पर hlint से सलाह पर ध्यान दें।) निम्न चरणों के विकास का एक सरल विधि के लिए कर रहे हैं, लेकिन मैं प्रासंगिक कारकों का सबसे बेनकाब सोचेंगे:

  • मॉड्यूल का नाम बदलें अधिक समझदार Poker.Elements को, Elements.hs

  • के रूप में सहेज नाम वाली उप-साथ poker नाम के एक निर्देशिका Poker

  • ले जाएँ Elements.hsमें बनाओ। अब इसका पदानुक्रमित नाम, Poker.Elements समझ में आता है। आपका निर्देशिका संरचना तो दिखता है:

    -- poker -- Poker -- Elements.hs 
    
  • poker अब ठीक से आयोजित किया जाता है। और

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

लेकिन हमारे विचार का निर्माण करना था cabal साथ poker पुस्तकालय स्थापित: वहाँ और ghci से टाइप ghci Poker/Elements.hs एक और अधिक जटिल संरचना में किसी भी अन्य Poker.x.y.z मॉड्यूल से निपटने के लिए कैसे पता चल जाएगा की तरह कहते हैं यह एक उपकरण। कुछ भी आसान नहीं है।

  • cdpoker में यदि आप नहीं हैं।

  • रन 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 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 है - अगले निर्देशिका में एक Poker.Elements --imports, के रूप में होने की संभावना है, तो यह भी पोकर के Elements के बारे में अपने विचारों को और अधिक उन्नत उपयोग करने के लिए फिर से बनाना।)

  • जोड़ते हैं नए मॉड्यूल, या नए पैकेज से आयात मॉड्यूल, poker.cabal की प्रासंगिक पंक्तियों में इन्हें निर्दिष्ट करें। आप भूल जाते हैं, cabal install विनम्रता याद दिलाएगा यदि आप ऐसा करने के लिए जब आप के पुनर्निर्माण के लिए प्रयास करें ...

  • अपलोड GitHub या पैच टैग या darcsden करने के लिए अपने poker पैकेज। जब आप इसे पूर्ण कर लेंगे, इसे हैकेज पर अपलोड करें। ध्यान दें कि गीथब या पैच-टैग पर भी यह 'हैकगेड' ब्रह्मांड से संबंधित है। यदि आप हैकेज पर फैनसीयर पैकेज से मॉड्यूल आयात करते हैं, तो जब लोग git clone या darcs get आपकी रिपोजिटरी, cabal install उनके लिए हैकेज.haskell.org से सही पैकेज प्राप्त करेंगे।

+1

मुझे शायद यह जोड़ना चाहिए कि, यदि आप एक धार्मिक रूपांतरण का अनुभव करते हैं और पोकर पैकेज को कभी भी लिखने वाले सभी सबूतों से छुटकारा पाना चाहते हैं, तो ghc-pkg को भूलने के लिए 'gc-pkg unregister पोकर-0.1' करें - यह आपको याद दिलाएगा पहले 'texas-holdem-0.1'' से निपटने के लिए, यदि यह मौजूद है - और 'rm ~/.cabal/lib/poker-0.1' संकलित लाइब्रेरी को मारने के लिए, तो मुझे लगता है कि' rm -r ../ पोकर' निर्देशिका में छुटकारा पाने के लिए :) – applicative

+0

अब 'कैबल' सैंडबॉक्स प्रदान करता है, तो इस उत्तर में शायद उनका उल्लेख होना चाहिए। – Jubobs

संबंधित मुद्दे