आदेश उदाहरण डेटा प्रकार पर कुछ कार्यों के लिए श्रेणी कानूनों पकड़ के लिए यह साबित करने के लिए, एक कैसे तय करते हैं कि कैसे समानता परिभाषित करने के लिए? का प्रतिनिधित्व बूलियन अभिव्यक्ति के लिए निम्न प्रकार को ध्यान में रखते:कैसे श्रेणी उदाहरण के लिए समानता को परिभाषित करने के?
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
यह संभव साबित करने के लिए कोशिश कर रहा है कि ऍक्स्प रूपों पहचान ETrue और ऑपरेटर के साथ एक श्रेणी:
(<&>) = EAnd
Eq को पुनर्परिभाषित बिना उदाहरण? यानी का डिफ़ॉल्ट उदाहरण का उपयोग करते हुए Eqबाएं पहचान कानून टूटता है,:
ETrue <&> e == e
झूठी मूल्यांकन करता है।
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
और के रूप में Eq उदाहरण:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
समस्या ठीक करता है हालांकि, एक eval समारोह को परिभाषित। ऐसे कानूनों को पूरा करने के दावा करने के लिए (==) सामान्य आवश्यकता के संदर्भ में तुलना है, या यह कहना है कि कानून समानता ऑपरेटर की एक विशेष प्रकार के लिए पकड़ के लिए पर्याप्त है?
आप संरचनात्मक समानता के रूप में '(==)' के डिफ़ॉल्ट कार्यान्वयन का उपयोग करने के लिए बाध्य नहीं हैं। यदि आप चाहते हैं कि यह कुछ आइसोमोर्फिज्म के बराबर है, तो यह ठीक है। ऐसा करने के लिए शायद यह खराब रूप है यदि समकक्ष लेकिन समान मूल्यों को अन्य तरीकों से आसानी से अलग नहीं किया जा सकता है। टाइप क्लास कानूनों में "समानता" की धारणा के लिए भी यही लागू होता है। –
श्रेणी कहां है? बस उत्सुक। –
@ सीए.एमसीकैन - धन्यवाद, कई मामलों में उचित तुलना लागू करना भी संभव नहीं होगा, इसलिए मुझे लगता है कि कम से कम यह पूरी तरह से गलत नहीं है कि मोनैड/मोनॉयड/कैटेगरी कानून कुछ वैकल्पिक आइसोमोर्फिज्म के संबंध में संतुष्ट हैं। – esevelos