2017-11-17 24 views
7

मैं एक समारोह है कि रिटर्न एक उत्पाद की कीमत है, यह वर्तमान में लग रहा है है की तरहटाइप करें "नाम" = Int - क्या यह घोषित करने लायक है?

priceOfProduct:: Int -> Int -> Int 

यह घोषित करने लायक है

type Price = Int 

समारोह

priceOfProduct :: Int -> Int -> Price ? 

मैंने सोचा कि हो जाता है तो यह है कि ऐसा करने के बाद, जैसा कि मैं इंट्स के टुपल्स का उपयोग करने के लिए जाता हूं, जो शायद बेहतर दिखेंगे यदि वे अपनी डेटा संरचना थे।

priceVsTaxed -> Price -> Int -> (Price, Price) 

क्या यह उपयोगी है? क्या यह आवश्यक है?

क्या यह अच्छी हास्केल शैली है?

एक डेटा संरचना घोषित कर रहा है जो मौजूदा डेटा संरचना को अच्छी शैली का नाम बदलने जैसा दिखता है?

+1

'Int -> Int -> Price' सहायक नहीं है, क्योंकि फ़ंक्शन का नाम पहले से ही दृढ़ता से दर्शाता है कि कीमत वापस आती है। 'टाइप मात्रा = Int' और' टाइप यूनिटप्रिस = Int' अधिक उपयोगी 'priceOfProduct :: मात्रा -> यूनिटप्रिस -> मूल्य', हालांकि अनुमति देगा। – chepner

+0

यदि आप निश्चित नहीं हैं कि यह अंत में फिट होगा या नहीं, तो इस प्रकार को बदलने का यह एक आसान तरीका भी है। –

उत्तर

11

यह अतिरिक्त प्रकारों को परिभाषित करने के लायक नहीं है, लेकिन निश्चित रूप से Int -> ... -> Int हस्ताक्षर से बचें। इससे यह समझना बहुत मुश्किल हो जाता है कि फ़ंक्शन का उपयोग कैसे किया जाना चाहिए।

तो वास्तव में मैं कहूंगा कि आपको शायद परिणाम न केवल परिणाम बल्कि विशेष रूप से तर्कों का नाम बदलना चाहिए। फिर, किसी को अपने कार्य का उपयोग करना चाहता है, तो, वे सिर्फ संकलक तर्क स्पष्ट करता हूं कर सकते हैं:

foo :: Price 
foo = priceOfProduct _ _ + priceOfProduct _ _ 

एक संकलक दे देंगे (GHC> = 7.10) की तरह

Foo.hs:Y:X: error: 
    • Found hole: _ :: PriceOfProductFirstArgument 
    • In the first argument of ‘priceOfProduct’, namely ‘_’ 
     In the expression: priceOfProduct _ _ 
     In an equation for ‘foo’: main = foo = priceOfProduct _ _ + priceOfProduct _ _ 

आप फिर भी विचार करना चाहिए संदेश यदि आप प्रकार भेद और अधिक कठोर बनाने के लिए नहीं करना चाहते हैं: एक साधारण type डीईएफ़ आप गलत क्रम में तर्क डालने से कभी नहीं बचा सकता है, तो शायद आप को बेहतर बनाने में होता यह

newtype Price = Price {priceInEuroCents :: Int} 

यह भी अस्पष्टता से बचाता है कि कीमत किस मात्रा/मात्रा में दी जाती है।

+1

अंतिम 'न्यूटाइप' के लिए छोटे जोड़े: 'न्यूटाइप मूल्य u = मूल्य {getPrice :: Int}' 'डेटा यूरो ',' डेटा यूएसडीओएलआर' के साथ, ... विभिन्न मुद्राओं के साथ 'मूल्य' कार्यों का पुन: उपयोग करना संभव बनाता है। – Zeta

+1

@ ज़ेटा शायद वास्तविक दुनिया के वित्तीय अनुप्रयोगों के लिए सही बात है (क्योंकि मुद्रा विनिमय काफी आइसोमोर्फिज्म नहीं है), लेकिन मुझे आमतौर पर मात्रा-इकाइयों के लिए इस दृष्टिकोण को पसंद नहीं है। ऐसे डेटा प्रकार को उस मात्रा के सामान्य भौतिक धारणा पर आईएमओ सार होना चाहिए, बिना किसी ठोस इकाई प्रणाली के संदर्भ के। – leftaroundabout

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