यह YAHT से व्यायाम करने के लिए मेरे समाधान है:क्या यह हैकेल नमूना छोटा हो सकता है?
व्यायाम 4.6 एक डेटाप्रकार टपल जो एक, दो, तीन या चार तत्वों पकड़ कर सकते हैं, निर्माता पर निर्भर करता है (लिखें कि है, वहाँ चार कंस्ट्रक्टर्स होना चाहिए , प्रत्येक तर्क के लिए एक)। फ़ंक्शन tuple1 को tuple4 के माध्यम से प्रदान करें जो एक ट्यूपल लेता है और उस स्थिति में केवल मान देता है, या कुछ भी वैध नहीं है (यानी आप टुपल 4 के लिए केवल दो तत्वों को पकड़ने के लिए पूछते हैं)।
जब मैं सही पहली पंक्ति मैं सादगी सी #
data Tuplex a b c d = Tuple1 a | Tuple2 a b | Tuple3 a b c | Tuple4 a b c d -- class Tuplex<a,b,c,d> { -- Tuplex(a p1){ _p1 = p1; } -- Tuplex(a p1, b p2){ _p1 = p1; _p2 = p2; } -- Tuplex(a p1, b p2, c p3){ _p1 = p1; _p2 = p2; _p3 = p3; } -- Tuplex(a p1, b p2, c p3, d p4){ _p1 = p1; _p2 = p2; _p3 = p3; _p4 = p4; } -- public Nullable<a> _p1; -- public Nullable<b> _p2; -- public Nullable<c> _p3; -- public Nullable<d> _p4; -- }
की तुलना में सी # मैं इस समस्या के बिना किसी भी क्षेत्र का उपयोग कर सकते में के बारे में उत्साहित थी लिखा था, लेकिन यहाँ मैं एक 'एक्सेसर कार्यों' लिखना चाहिए? और यहां कोड की मात्रा मुझे दुखी बनाती है।
क्या मेरे पास यहां छोटा कोड हो सकता है?
tuple1 ∷ Tuplex a b c d → Maybe a tuple2 ∷ Tuplex a b c d → Maybe b tuple3 ∷ Tuplex a b c d → Maybe c tuple4 ∷ Tuplex a b c d → Maybe d tuple1 (Tuple1 a) = Just a tuple1 (Tuple2 a b) = Just a tuple1 (Tuple3 a b c) = Just a tuple1 (Tuple4 a b c d) = Just a tuple2 (Tuple1 a) = Nothing tuple2 (Tuple2 a b) = Just b tuple2 (Tuple3 a b c) = Just b tuple2 (Tuple4 a b c d) = Just b tuple3 (Tuple1 a) = Nothing tuple3 (Tuple2 a b) = Nothing tuple3 (Tuple3 a b c) = Just c tuple3 (Tuple4 a b c d) = Just c tuple4 (Tuple1 a) = Nothing tuple4 (Tuple2 a b) = Nothing tuple4 (Tuple3 a b c) = Nothing tuple4 (Tuple4 a b c d) = Just d -- unit tests prop_tx1 = tuple1 (Tuple1 4) ≡ Just 4 prop_tx2 = tuple1 (Tuple2 4 'q') ≡ Just 4 prop_tx3 = tuple2 (Tuple1 4) ≡ (Nothing ∷ Maybe Char) prop_tx4 = tuple2 (Tuple2 4 'q') ≡ Just 'q'
BTW सी # फायदे यहाँ से एक हो सकता है कि Nullable की तुलना में है। सी # में हमारे पास विशेष वाक्यविन्यास है (?पोस्टफिक्स) और पूरी तरह से पारदर्शी (लेकिन अभी भी वैकल्पिक रूप से नियंत्रित करने योग्य) टी के बीच रूपांतरण? और टी (int? और int)। अनबॉक्सिंग के दौरान भी, मैं ऑब्जेक्ट x = 5 कर सकता हूं; var y = (int?) x। Int बी = 5 से अनावश्यक रूपांतरण के बारे में उल्लेख नहीं है; int करने के लिए? सी = बी; –
ओह, इतने सारे उत्तर और तरीके ... और आप जानते हैं क्या? अगर हम 1 9 डैनियल के जवाब को छोड़कर, उस अभ्यास बिंदु पर लेखक को उस मात्रा में ज्ञान प्रदान करते हैं, तो कुछ भी पर्याप्त नहीं है ... निश्चित रूप से, आगे पढ़ने से 'कहां' या '>> =' पर कुछ प्रकाश आ सकता है या '> =>' ऑपरेटर ... लेकिन मुझे यह जवाब काफी जटिल है, मुझे लगता है कि, मुझे लगता है कि मेरे द्वारा, मुश्किल लगता है :) बहुत जवाब के लिए धन्यवाद। –