2014-04-02 8 views
12

मुझे यह कोड unm-hip पैकेज में मिला है। तो पिक्सेल एक समारोह है?इस हैकेल कोड में स्टार का क्या अर्थ है?

class Imageable i where 
    type Pixel i :: * 
    rows :: i -> Int 
    cols :: i -> Int 
    ref :: i -> Int -> Int -> (Pixel i) 
    makeImage :: Int -> Int -> PixelOp (Pixel i) -> i 
    pixelList :: i -> [Pixel i] 
    pixelList i = [ ref i r c | r <- [0..(rows i - 1)], c <- [0..(cols i - 1)]] 

उत्तर

15

मानक हास्केल के विस्तार के रूप में, आप "प्रकार" से निपट सकते हैं। प्रकार प्रकार और प्रकार के रचनाकारों के लिए एक बहुत ही बुनियादी प्रकार की प्रणाली के प्रकार हैं। दया * एक साधारण प्रकार है, जैसे Int। दया * -> * एक प्रकार का कन्स्ट्रक्टर है जो एक प्रकार लेता है और Maybe जैसे प्रकार का उत्पादन करता है: इसे Int जैसे एक तर्क के रूप में पास करें, और आपको Maybe Int टाइप करें।

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

यहाँ, इसका मतलब है कि एक प्रकार iImageable का एक उदाहरण है (यानी एक छवि की तरह बर्ताव करता है) कि एक संबद्ध पिक्सेल प्रकार Pixel i होनी आवश्यक है और यह एक सरल प्रकार (तरह *), नहीं एक प्रकार निर्माता होना चाहिए।

+0

क्या आप जानते हैं कि कोड लेखक इस डिज़ाइन का उपयोग क्यों करते हैं? – osager

+2

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

1

"तो पिक्सेल एक समारोह है?"

पिक्सेल एक प्रकार-स्तरीय फ़ंक्शन है। यह एक प्रकार का होता है (जो छवि के उदाहरण का होना चाहिए) और एक प्रकार का प्रकार '*' देता है। उदाहरण कोड में इसके उपयोग के आधार पर, इनपुट प्रकार भी '*' होना चाहिए। तो, पिक्सेल शायद बहुत पसंद है, वे '* -> *' प्रकार के "प्रकार कन्स्ट्रक्टर" दोनों हैं, आप उन्हें "सरल प्रकार" प्रदान करते हैं और वे "सरल प्रकार" लौटाते हैं। वे एक ही स्थान पर मान्य हैं। जैसे कि आपके पास 'Foo -> शायद' प्रकार का कोई फ़ंक्शन नहीं हो सकता है, आप भी 'बार -> पिक्सेल' प्रकार का फ़ंक्शन नहीं कर पाएंगे।

+0

तो 'टाइप' कीवर्ड एक हैकेल प्रकार समानार्थी शब्द सही नहीं है? यदि आपने कहा है कि ऐसा क्यों नहीं लिखा गया है: 'पिक्सेल :: i -> * – osager

+1

@osager यह संबंधित है, लेकिन समान नहीं है। जब आप एक (इमेज करने योग्य my_image) उदाहरण प्रदान करते हैं, तो पिक्सेल के लिए आपकी परिभाषा एक मौजूदा प्रकार होनी चाहिए और (पिक्सेल my_image) उस प्रकार के लिए उपनाम/समानार्थी होगा। यह एक जीएचसी एक्सटेंशन है जिसे (खुले) प्रकार के परिवार कहा जाता है। –

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