संभव डुप्लिकेट:
Making (a, a) a Functorक्यों (ए, ए) एक मजेदार नहीं है?
मैं quicksort के निम्नलिखित कार्यान्वयन लिखा है:
import Data.List (partition)
quicksort [] = []
quicksort (x:xs) =
let (smaller, notSmaller) = partition (< x) xs
in quicksort smaller ++ x : quicksort notSmaller
तब मैं quicksort
करने के लिए दो पुनरावर्ती कॉल संक्षिप्त करना चाहता था fmap
लगाने से सूची जोड़ी:
quicksort (x:xs) =
let (smaller, notSmaller) = fmap quicksort $ partition (< x) xs
in smaller ++ x : notSmaller
लेकिन जाहिर है, (a, a)
एक मजेदार नहीं है। ऐसा क्यों है? मैं एक प्रदान करने की कोशिश:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
लेकिन GHCi मेरी प्रयास पसंद नहीं आया:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
किसी को भी मुझे लगता है कि त्रुटि समझा सकते हैं? मैंने विभिन्न "फिक्स" की कोशिश की, लेकिन उनमें से कोई भी काम नहीं किया।
क्या (a, a)
Functor
का एक उदाहरण बनाना संभव है? या टाइप सिस्टम पर्याप्त अभिव्यक्तिपूर्ण नहीं है?
आह, मैंने कोशिश की कि एक प्रकार (= ए, ए) टाइप करें और यह काम नहीं करता है। – fredoverflow
@FredOverflow 'type' सी ++ में' typedef' के समान है; यह एक नया प्रकार नहीं बनाता है, केवल एक उपनाम (इसलिए इससे कोई फर्क नहीं पड़ता)। – qox