मेरे पास एक प्रकार Image
है जो मूल रूप से फ्लोट की सी-सरणी है। जैसे map :: (Float -> Float) -> Image -> Image
, या zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image
जैसे कार्यों को बनाना आसान है।एक मजेदार के बिना आवेदक
हालांकि, मुझे एहसास है कि इन कार्यों के शीर्ष पर एक आवेदक उदाहरण की तरह दिखने वाला कुछ भी प्रदान करना संभव होगा, जिससे ((+) <$> image1 <*> image2)
या ((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3)
जैसे अधिक लचीले पिक्सेल स्तर में हेरफेर की अनुमति मिल सके। हालांकि, निष्पक्ष दृष्टिकोण विफल रहता है, क्योंकि छवि प्रकार में फ्लोट्स के अलावा अन्य चीजें नहीं हो सकती हैं, जिससे fmap
को कार्यान्वित करना असंभव हो जाता है।
इसे कैसे लागू किया जा सकता है?
क्यों आप छवि को फ्लोट के अलावा अन्य चीज़ों को शामिल करने की अनुमति नहीं देंगे? निश्चित रूप से, आपका 'प्रदर्शन :: छवि फ़्लोट -> आईओ() 'केवल फ्लोट के साथ छवियां ले सकता है, लेकिन अन्य कार्यों जैसे' मानचित्र 'के लिए इससे कोई फर्क नहीं पड़ता। –
छवि प्रकार एक सी सरणी है जिसे रूपांतरणों में बहुत अधिक समय व्यतीत किए बिना सी कार्यों में पारित करने की आवश्यकता होती है। साथ ही, मुझे लगता है कि अगर यह कामों की तरह चीजें पकड़ सकता है, तो 'शुद्ध' पर कॉल करने के बाद कुछ मिलियन आंशिक रूप से मूल्यांकन किए गए कार्यों के बजाय बदसूरत प्रदर्शन-वार होगा। (कार्यों की छवि रखने के द्वारा 'शुद्ध' को कार्यान्वित करना भी समस्याग्रस्त है क्योंकि यह छवि के आकार को नहीं जान सकता है।) – aleator
क्या आप अपना प्रकार 'प्रकार छवि = कैरे फ़्लोट' जैसे परिभाषित कर सकते हैं और एफएमएपी के साथ कैरे के लिए फ़ंक्शन उदाहरण बना सकते हैं आपका नक्शा फ़ंक्शन होने के नाते, और आप सुनिश्चित करते हैं कि आप किसी भी चीज का कैरे नहीं बना सकते हैं लेकिन कैरे फ़्लोट (उदाहरण के लिए, कन्स्ट्रक्टर को निर्यात न करें) –