2011-12-14 6 views
8

हम फ़ंक्शन परिभाषाओं के लिए प्रकार समानार्थी का उपयोग कर सकते हैं, उदा।एक नए प्रकार के डेटा कन्स्ट्रक्टर में फ़ंक्शन परिभाषा का उदाहरण

type FuncDef = Int -> Int -> Int 

यह हर बार लंबी फ़ंक्शन परिभाषा लिखने से बचाता है।

उपयोग:

someFunc :: FuncDef -> Int 

बजाय

someFunc :: (Int -> Int -> Int) -> Int 

जो अधिक पठनीय और कम कोड के रूप में अच्छी तरह से है।

सरल बीजगणितीय डेटा प्रकार सीधे आगे और पैटर्न मिलान आदि करने में आसान हैं, उदाहरण के लिए

data AType = X | Y | Z Int 
matchType :: AType -> Bool 
matchType X = .. 
matchType Y = .. 
matchType (Z _) = .. 

जैसा कि मैंने हास्केल डेटा प्रकार में और अधिक लग रही है, मैंने पाया हम डेटा निर्माता में समारोह परिभाषा हो सकती है जब नए प्रकार को परिभाषित।

data MyType a b = X | Y (a -> b) 

यह मुझे थोड़ा सा पहेली करता है और इस के आसपास के कई उदाहरण नहीं देखे हैं। एक तरह से, उच्च-आदेश फ़ंक्शन का विचार जहां कोई फ़ंक्शन तर्क के रूप में कोई अन्य कार्य ले सकता है, इस स्थिति के समान है, सिवाय इसके कि यह डेटा प्रकार पर लागू होता है। हास्केल विकी "उच्च-आदेश डेटा प्रकार परिभाषा" के बारे में बहुत कुछ नहीं कहता है। मुझे एहसास है कि मुझे इन सभी शर्तों को गलत हो रहा है, इसलिए कृपया मुझे सही करें, और मुझे और पढ़ने के लिए इंगित करें। मैं वास्तव में इसका ठोस उपयोग देखना चाहता हूं। धन्यवाद!

matchMyType :: (MyType a b) -> Bool 
matchMyType X = .. 
matchMyType Y ?? = .. 
+8

मुझे लगता है कि आप बहुत चिंता कर सकते हैं! जैसा कि आप कहते हैं, कार्यों को तर्क के रूप में पारित किया जा सकता है। ऐसा इसलिए है क्योंकि फ़ंक्शंस किसी भी अन्य मूल्य से स्वाभाविक रूप से अलग नहीं हैं। आप उन्हें डेटा प्रकार में डाल सकते हैं और उन्हें पैटर्न मिलान से निकाल सकते हैं। वास्तव में यह सब कुछ है। –

+0

धन्यवाद +1, यह बिल्कुल समझ में आता है कि आपने क्या कहा था। क्या आप मुझे एक उदाहरण दे सकते हैं जहां मैं केवल मूल्यों की बजाय डेटा संरचना में फ़ंक्शन डालना चाहता हूं। एक पेड़ में पूर्णांक? – vis

+1

खैर, अधिकांश व्यावहारिक उपयोग मैं डेटा प्रकारों के कार्यों के बारे में सोच सकता हूं जो अधिक जटिल हैं और संभवतः इस मुद्दे से विचलित हो जाएंगे। यदि आप एक सामान्य उदाहरण चाहते हैं, तो डेव 4420 का जवाब ठीक होगा। यदि आप सोचने के लिए कुछ और चुनौतीपूर्ण चाहते हैं, तो अनिवार्य उदाहरण शायद [राज्य मोनैड ट्रांसफार्मर] है (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-trans-State -Lazy.html # छ: 2)। –

उत्तर

11

आप कई स्थितियों में इस तरह के पैटर्न का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप एक समारोह है कि विभिन्न तरीकों से तार बदल देती हैं, तो आप इस तरह एक डेटा प्रकार हो सकता है (यह एक उदाहरण मात्र है कि सिद्धांत को दर्शाता है है - इस तरह कोड लिखने नहीं है!):

data StringTransformation = 
    -- | Doesn't transform the string at all 
    NoTransformation | 
    -- | Takes the string and generates a suffix that should be appended 
    Append (String -> String) | 
    -- | Takes the string and generates a prefix that should be prepended 
    Prepend (String -> String) | 
    -- | Takes the string and transforms it arbitrarily to a new string 
    Map (String -> String) 

फिर, इसका उपयोग करने वाला एक प्रोग्राम इस तरह दिख सकता है:

-- | Returns 'True' if the name is male 
isMaleName :: String -> Bool 
isMaleName = ... 

-- | Adds a title to a name, for example "John Smith" -> "Mr. John Smith" 
addTitle :: StringTransformation 
addTitle = 
    PrependTransformation $ \ name -> 
    if isMaleName name 
    then "Mr. " 
    else "Mrs. " 

-- Applies a string transformation to a 'String'. 
transformString :: StringTransformation -> String -> String 
transformString NoTransformation str = str 
transformString (Append f) str  = str ++ f str 
transformString (Prepend f) str  = f str ++ str 
transformString (Map f) str   = f str 
+0

+1 अच्छा उदाहरण :) अगर मुझे कोई दूसरा नहीं मिलता है तो जवाब स्वीकार करेगा। – vis

4
data Thingy a b = A b 
       | B (a -> b) 

really :: Thingy a b -> a -> b 
really (A x) _ = x    -- x :: b 
really (B f) y = f y   -- f :: a -> b, y :: a, f y :: b 

C.A.McCann कहते हैं, वहाँ वास्तव में कार्यों के बारे में कुछ खास नहीं है।

+0

धन्यवाद। मुझे लगता है कि पैटर्न मिलान में तर्कों का क्रम सही नहीं है। मैं देखता हूं कि किसी भी सामान्य उच्च-आदेश फ़ंक्शन के समान, डेटा प्रकार में फ़ंक्शन पर मिलान करने वाले पैटर्न को कैसे करें। इस प्रकार एक समारोह क्यों स्टोर करें? : – vis

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