2010-06-27 9 views
23

कहें कि मेरे पास 1 से MAGIC_NUMBER तक की संख्याओं की एक सूची है - क्या कोई तरीका है कि मैं इसे पहले घोषित कर सकता हूं?जादू संख्या से बचने के लिए, मैं हैकेल में स्थिरांक का उपयोग कैसे करूं?

+1

"घोषित संख्या" से आपका क्या मतलब है? – ony

+0

आपको एक बहुत ही महत्वपूर्ण बिंदु स्पष्ट करना चाहिए: आप जादू संख्या कब जानते हैं? यदि आप इसे संकलित समय पर जानते हैं तो चक के पास सही जवाब है। –

उत्तर

13

आप अपने सभी गणना में बीजीय डेटा का उपयोग कर सकते हैं और कुछ नामित मूल्यों का उपयोग करता है, तो वे वास्तव में "जादू" कर रहे हैं, या निर्माण करने के लिए "जादू" संख्या बीजीय मूल्यों की प्रस्तुत करना और कई और अधिक:

class FlagsMask f where mask :: f -> Int 

data Magics = Alpha | Beta | Gamma 
    deriving (Enum, Read, Show, Eq, Ord) 

instance FlagsMask Magics where 
    mask m = 2^fromEnum m 

data PermsFlag = FlagRead | FlagWrite | FlagExec | FlagSuper 

-- [flagRead, flagWrite, flagExec] = [2^n | n <- [0..2]] 
(flagRead : flagWrite : flagExec : _) = [2^n | n <- [0..]] 
flagSuper = 16 

instance FlagsMask PermsFlag where 
    mask FlagRead = flagRead 
    mask FlagWrite = flagWrite 
    mask FlagExec = flagExec 
    mask FlagSuper = flagSuper 
*Main> map fromEnum [Alpha .. ] 
[0,1,2] 
it :: [Int] 
*Main> zip [Alpha .. ] [1..] 
[(Alpha,1),(Beta,2),(Gamma,3)] 
it :: [(Magics, Integer)] 

45

निश्चित रूप से। वास्तव में, यह देखते हुए कि हास्केल पूरी तरह कार्यात्मक है, एक निरंतर की तुलना में निरंतर परिभाषित करना बहुत आसान है।

magicNumber = 42 

magicList = [1..magicNumber] 
35

चक और ओनी के उत्तर सही हैं। दूसरी पंक्ति में magicNum एक पैटर्न सबसे मेल खाता है कि, बस f x = 'A' की तरह है -

magicNum = 42 

f magicNum = 'A' 
f _ = 'B' 

नहीं है कि तुम क्या उम्मीद कर सकते हैं: वहाँ एक जाल आप के बारे में पता होना चाहिए। f x | x == magicNum = 'A' का उपयोग करें।

+1

वास्तव में, आप मानक ऑपरेटरों को इस तरह से भी पुनर्जीवित कर सकते हैं। उदाहरण के लिए, यदि आप 'f (==) फ़ंक्शन को परिभाषित करते हैं तो b = a == b', और फिर' f div 8 4' पर कॉल करें, परिणाम 2 होगा, झूठी नहीं। (यह निश्चित रूप से, एक रोगजनक बात करने के लिए है।) – Chuck

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

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