बार-बार नहीं, कोई उत्पाद डेटा प्रकार पर <=>
(तुलना, या "स्पेसशिप") ऑपरेटर को लागू करना चाहता है, यानी, कई फ़ील्ड वाले वर्ग (जिसमें से सभी (हम आशा करते हैं!) पहले से ही <=>
लागू किया गया है), एक निश्चित क्रम में फ़ील्ड की तुलना।रूबी का प्रभाव <=> कॉम्बिनेटर
def <=>(o)
f1 < o.f1 && (return -1)
f1 > o.f1 && (return 1)
f2 < o.f2 && (return -1)
f2 > o.f2 && (return 1)
return 0
end
यह दोनों कठिन और त्रुटि-प्रवण है, खासकर कई क्षेत्रों के साथ। यह त्रुटि-प्रवण पर्याप्त है कि मुझे अक्सर लगता है कि मुझे उस कार्य को यूनिट परीक्षण करना चाहिए, जो केवल थकाऊपन और क्रियाशक्ति में जोड़ता है।
हास्केल ऐसा करने का एक विशेष रूप से अच्छा तरीका प्रदान करता है:
import Data.Monoid (mappend) import Data.Ord (comparing) -- From the standard library: -- data Ordering = LT | EQ | GT data D = D { f3 :: Int, f2 :: Double, f1 :: Char } deriving Show compareD :: D -> D -> Ordering compareD = foldl1 mappend [comparing f1, comparing f2, comparing f3]
(fold
से परिचित नहीं उन लोगों के लिए, ऊपर
comparing f1 `mappend` comparing f2 `mappend` comparing f3
जो एक समारोह है कि दो के लिए लागू किया जा सकता का उत्पादन करने के लिए फैलता है D
एस, Ordering
का उत्पादन करने के लिए।)
compareD
का निर्धारण है इतना आसान है कि यह स्पष्ट रूप से सही है, और मुझे स्थिर प्रकार की जांच के बिना भी यूनिट परीक्षण की आवश्यकता महसूस नहीं होगी।
वास्तव में, सवाल यह भी थोड़ा और अधिक दिलचस्प है, क्योंकि मैं सिर्फ मानक <=>
ऑपरेटर का उपयोग करने के लिए नहीं चाहते हो सकता है, लेकिन हो सकता तरह अलग अलग समय पर अलग अलग तरीकों से, जैसे:
sortByOrderings :: [a -> a -> Ordering] -> [a] -> [a] sortByOrderings = sortBy . foldl1 mappend sortByF3F1 = sortByOrderings [comparing f3, comparing f1] sortByF2F3 = sortByOrderings [comparing f2, comparing f3]
तो, प्रश्न:
- रूबी में इस तरह की चीज को लागू करने का सामान्य तरीका क्या है?
- मानक पुस्तकालयों में जो परिभाषित किया गया है उसका उपयोग करके इसे करने का सबसे अच्छा तरीका क्या है?
- उपरोक्त हास्केल कोड में कितना नज़दीक हो सकता है, और तुलना में यह कितना विश्वसनीय है? यदि आवश्यक हो, तो कैसे एक यह सुनिश्चित कर सकता है कि फ़ील्ड्स को
<=>
या<
और>
ऑपरेटरों को उचित रूप से लागू किया गया हो?
संयोग से, जबकि यह एक रूबी सवाल यह है कि, मैं विषय पर हास्केल तकनीक की चर्चा पर विचार करना है, तो इस साइट के वृद्ध तो इस बात से सहमत खुश हूँ। कृपया इस पर टिप्पणी करने में संकोच न करें कि यह उचित है या नहीं, और यदि यह है, तो इस पोस्ट को 'हैकसेल' भी टैग करें।
ग्रेट सामान। यह मुझे एक ही आसान 'sortBy' चीज़ नहीं मिलता है जो हास्केल करता है, लेकिन यह निश्चित रूप से डिफ़ॉल्ट तुलना से निपटने का एक अच्छा काम करता है! –
ध्यान रखें कि आप Enumerable # सॉर्ट का उपयोग बहुत अधिक तरीके से कर सकते हैं जैसे Haskell's List.sortBy (बस करीबी के बिना, क्षमा करें)। और संख्यात्मक # sort_by आपको क्रमबद्ध समय पर सॉर्टिंग कुंजी को परिभाषित करने देता है। – rampion
+1, रूबी कोड के बेहतर बिट्स में से एक मैंने SO पर देखा है – Allyn