2012-04-15 8 views
13

मैं हास्केल डेटा कन्स्ट्रक्टर में इनपुट चेक कैसे जोड़ सकता हूं? मान लें कि मेरे पासहास्केल डेटा कन्स्ट्रक्टर में इनपुट चेक

import Data.Time.Calendar 

data SchedulePeriod = SchedulePeriod { startDate :: Day 
    , endDate :: Day 
    , accrualStart :: Day 
    , accrualEnd :: Day 
    , resetDate :: Day 
    , paymentDate :: Day 
    , fraction :: Double } 
    deriving (Show) 

और मैं एक बाधा startDate < endDate लागू करना चाहता हूं। क्या कोई सार डेटा प्रकार बनाये बिना ऐसा करने का कोई तरीका है?

+0

संभावित डुप्लिकेट [प्रतिबंधों के साथ एक प्रकार कैसे बनाएं] (http://stackoverflow.com/questions/7978191/how-to-make-a-type-with-restrictions) – ehird

उत्तर

17

मानक तरीका एक smart constructor कि मूल्य बनाने से पहले पूर्व शर्त की जाँच करता है उपयोग करने के लिए, और वास्तविक निर्माता इसे इस्तेमाल करता है निर्यात नहीं कर रहा है। बेशक, यह एक अमूर्त डेटा प्रकार बना रहा है, जैसा आपने कहा था।

एक स्मार्ट निर्माता के बिना इस लक्ष्य को हासिल करने के लिए किया जाएगा एक ही रास्ता वास्तव में बुराई प्रकार प्रणाली hackery (और आप मानक Day प्रकार का उपयोग करने में सक्षम नहीं होगा)।

+0

क्या मैं स्मार्ट में नामित पैरामीटर का उपयोग कर सकता हूं कंस्ट्रक्टर्स? –

+0

यदि आपका मतलब रिकॉर्ड वाक्यविन्यास का अनुकरण करना है, तो दुर्भाग्य से नहीं। हालांकि, आप स्मार्ट कन्स्ट्रक्टर के इनपुट के रूप में कार्य करने के लिए एक और रिकॉर्ड परिभाषित कर सकते हैं। यह शायद डुप्लिकेशंस के लायक है यदि आपका कन्स्ट्रक्टर इनपुट को मान्य करने के अलावा कुछ और करता है, हालांकि (उदा।सहायक क्षेत्रों की गणना)। – ehird

+3

@quant_dev यदि आप एक अमूर्त डेटा प्रकार नहीं चाहते हैं तो आप रचनाकारों पर पैटर्न मिलान कर सकते हैं, आप स्मार्ट कन्स्ट्रक्टर के दोहरे कर सकते हैं और स्मार्ट विनाशकों को लागू कर सकते हैं ('शायद' और 'या तो' के समान)। –

13

ईर्ड के जवाब को स्वीकार करें। मैं बस इसे लिख रहा हूं इसलिए मैं एक टिप्पणी में वर्णित स्मार्ट विनाशकों को समझा सकता हूं और मैं एक टिप्पणी में स्पष्टीकरण फिट नहीं कर सकता।

data T x y z = A | B x | C y z 

ehird पहले से ही बताया कि कैसे करने के लिए दूर सार निर्माता, जो सिर्फ है "स्मार्ट" कंस्ट्रक्टर्स प्रदान करने के लिए:

मान लीजिए कि आप प्रकार है कि करते हैं। जैसा आपने बताया है, इसके लिए रचनाकारों को छिपाने की आवश्यकता है और फिर आप उन्हें पैटर्न मिलान में उपयोग नहीं कर सकते हैं। हालांकि, आप इसे "स्मार्ट" विनाशक का उपयोग करके हल कर सकते हैं, जो प्रत्येक संभावित कन्स्ट्रक्टर के खिलाफ पैटर्न-मिलान के बराबर है।

यह समझाने के लिए, का पहला कैसे हम प्रकार टी के एक समारोह लिखते हैं के साथ शुरू करता है, तो कंस्ट्रक्टर्स खुल गए हैं:

myFunction :: T x y z -> d 
myFunction t = case t of 
    A  -> f1 
    B x -> f2 x 
    C y z -> f3 y z 

हम समारोह के प्रकार हस्ताक्षर से पता है कि f1, f2 के प्रकार, और f3 होना चाहिए:

f1 :: d 
f2 :: x -> d 
f3 :: y -> z -> d 

तो अगर हम myFunction सामान्यीकरण करने के लिए एक स्मार्ट नाशक होने के लिए गए थे, हम सिर्फ पारित f1, f2, और +०१२३२६२२०३७इसे करने के लिए के रूप में पैरामीटर:

smartDestructor :: d -> (x -> d) -> (y -> z -> d) -> t -> d 
smartDestructor f1 f2 f3 t = case t of 
    A  -> f1 
    B x -> f2 x 
    C y z -> f3 y z 

तो अगर आप निर्यात smartDestructor, तो लोग कर सकते हैं मूल रूप से निर्माताओं के लिए उपयोग की जरूरत के बिना अपने प्रकार के खिलाफ पैटर्न मैचों की।

क्या तुमने कभी maybe या either कार्यों का उपयोग किया है, इससे पहले कि, तो आप एक स्मार्ट नाशक का उपयोग किया है, हालांकि उन मामलों में कंस्ट्रक्टर्स छिपी नहीं हैं, इसलिए वे मुख्य रूप से सुविधा कार्यों के रूप में प्रदान की जाती हैं:

maybe :: b -> (a -> b) -> Maybe a -> b 
maybe f1 f2 m = case m of 
    Nothing -> f1 
    Just a -> f2 x 

either :: (a -> c) -> (b -> c) -> Either a b -> c 
either f1 f2 e = case e of 
    Left a -> f1 a 
    Right b -> f2 b 

आपके मामले में, स्मार्ट विनाशक का उद्देश्य बस इतना है कि आप रचनाकारों को छुपा सकते हैं और रचनाकारों का पर्दाफाश नहीं कर सकते हैं।

+0

धन्यवाद, बहुत प्रबुद्ध। काश मैं दो उत्तरों स्वीकार कर सकता हूं ... –

+3

@quant_dev मैंने अभी सीखा है कि "स्मार्ट विनाशकों" के लिए एक बेहतर नाम है। इसे डेटा प्रकार "चर्च एन्कोडिंग" कहा जाता है और यह इस तथ्य को संदर्भित करता है कि किसी भी डेटा प्रकार को फ़ंक्शन के रूप में प्रदर्शित किया जा सकता है, और इस कार्यात्मक एन्कोडिंग को "चर्च एन्कोडिंग" कहा जाता है। वास्तव में अच्छी व्याख्या के लिए, इस लिंक को देखें: http://web.archiveorange.com/archive/v/nDNOvgzSRV6TNq8KhCgZ –

+0

धन्यवाद, मैं इसे पढ़ूंगा। –

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