2012-02-20 9 views
21

एक टर्नरी लॉजिक टेबल बनाना, और मैं ऑपरेटर के लिए अपना स्वयं का फ़ंक्शन बनाना चाहता हूं जिसे मैं <=> पर कॉल करूंगा।मैं हास्केल में ऑपरेटर कैसे बना सकता हूं?

तो, उदाहरण के लिए, मैं यह करना चाहता हूं, लेकिन यह सही नहीं है। ऐसा करने का सही तरीका क्या है?

data Ternary = T | F | M 
deriving (Eq, Show, Ord) 

<=> :: Ternary -> Ternary -> Ternary 
<=> T F = F 
<=> T T = T 
<=> T M = M 
<=> F F = T 
<=> F T = F 
<=> F M = M 
<=> M F = M 
<=> M T = M 
<=> M M = T 
+3

बस एक साइड एन के रूप में ओटी, 'एम <=> एम'' टी' के बजाय 'एम' होना चाहिए। लेकिन यह आपके "शायद" अर्थशास्त्र पर निर्भर करता है। – bitmask

+0

यह मत भूलना कि आप 'infixl',' infixr' का उपयोग करके धैर्य और सहयोगीता सेट कर सकते हैं ... – Landei

उत्तर

36

बस अपने ऑपरेटर के आसपास कोष्ठक जोड़ें:

(<=>) :: Ternary -> Ternary -> Ternary 
(<=>) T F = F 
(<=>) T T = T 
(<=>) T M = M 
(<=>) F F = T 
(<=>) F T = F 
(<=>) F M = M 
(<=>) M F = M 
(<=>) M T = M 
(<=>) M M = T 

यह फार्म उपसर्ग को इन्फ़िक्स रूप से यह बदल जाता है। वैकल्पिक रूप से, आप बस परिभाषा इन्फ़िक्स उपयोग कर सकते हैं:

-- Works: 
(<^>) :: Int -> Int -> Int 
a <^> b = a + b 

-- Doesn't work: 
{- 
<^> :: Int -> Int -> Int 
<^> a b = a + b 
-} 

-- Works: 
letters :: Int -> Int -> Int 
letters a b = a + b 

-- Doesn't work: 
{- 
(letters) :: Int -> Int -> Int 
a letters b = a + b 
-} 

मैं वादा करता हूँ, यद्यपि - हास्केल अच्छी तरह से जटिल नियम सीखने लायक है:

प्रतीकों के साथ
(<=>) :: Ternary -> Ternary -> Ternary 
T <=> F = F 
T <=> T = T 
T <=> M = M 
F <=> F = T 
F <=> T = F 
F <=> M = M 
M <=> F = M 
M <=> T = M 
M <=> M = T 
+0

क्या 'cons' ऑपरेटर की तरह कुछ बनाने का कोई तरीका है? ': 'विपक्ष ऑपरेटर में यह विशेष सुविधा है जहां यह एक सूची होने के लिए दाईं ओर सब कुछ मानता है। मैं 'ऑपरेटर' को फिर से बनाने की कोशिश कर रहा हूं, लेकिन इसे हमेशा दाईं ओर ब्रांड्स की आवश्यकता होती है। – CMCDragonkai

+0

@ClarkGaebel: शायद यह 'infix' का उल्लेख करना दिलचस्प हो सकता है? –

+0

@CMCDragonkai आप वही काम स्वयं कर सकते हैं: 'डेटा सूची एक = नील | ए: - एक सूची और फिर महत्वपूर्ण भाग सूचीबद्ध करें: 'infixr 5: -'। 5 होना जरूरी नहीं है, लेकिन यह सूचियों की प्राथमिकता है, केवल 'infixr' होना चाहिए और' infixl' या 'infix' नहीं होना चाहिए। 'infixl 9' डिफ़ॉल्ट – semicolon

8

समारोह के नाम के बिना उन की तुलना में अलग वाक्य रचना की है।

+11

पूर्णता के लिए है:' '' 'अक्षर 'बी'' काम करता है ... –

1

आप (लाइन वार) परिभाषा इस प्रकार को आसान बनाने में कर सकते हैं:

data Ternary = T | F | M 
deriving (Eq, Show, Ord) 

(<=>) :: Ternary -> Ternary -> Ternary 
x <=> y = if x == y then T else max x y 

आप परिवर्तन के लिए हो रहे हैं तो:

(<=>) :: Ternary -> Ternary -> Ternary 
T <=> T = T 
F <=> F = T 
M <=> M = T 
M <=> _ = M 
_ <=> M = M 
_ <=> _ = F 
+0

यह मेरे लिए आसान नहीं लग रहा है। –

+0

यही कारण है कि मेरे पास '(लाइन-वार)' है। स्पष्टता हालांकि बहस योग्य है। मैं कोड को बेहतर तरीके से देख सकता हूं क्योंकि कच्चे सारणीबद्ध परिभाषा को देखने के विरोध में मुझे वास्तव में क्या करना है, इसे कम करने के लिए मजबूर होना पड़ता है। लेकिन वह मैं हूँ। –

+0

आईएमओ यह आसान है, मैं जल्दी से देख सकता हूं कि यदि वे बराबर हैं तो सत्य वापस आते हैं, अगर वे नहीं हैं लेकिन एक शायद एक है, तो शायद वापस लौटें, अगर वे बराबर नहीं हैं और शायद इसमें शामिल नहीं हैं तो झूठी वापसी । केवल एक हिस्सा जो मुझे आश्चर्यजनक लगेगा वह 'एम <=> एम' 'टी' भाग है। – semicolon

0

जब से तुम Eq और Ord है, तो आप निम्न कर सकते हैं यह M <=> M == M है, तो आप निम्न कार्य कर सकते हैं:

data Ternary = M | T | F 
deriving (Eq, Show, Ord, Enum) 

(<=>) :: Ternary -> Ternary -> Ternary 
x <=> y = fromEnum $ rem (toEnum x * toEnum y) 3 
संबंधित मुद्दे