आपका प्रकार हस्ताक्षर काम नहीं करेगा। आपको पास किए गए फ़ंक्शन को टुपल्स की एक सूची देने में सक्षम होना चाहिए, जिसका अर्थ है कि आपको या तो उच्च-रैंक प्रकारों का उपयोग करना है ताकि इसे पॉलीमोर्फिक होने के लिए मजबूर किया जा सके, या स्पष्ट रूप से आपके प्रकार के हस्ताक्षर में टुपल्स का उल्लेख किया जा सके।
इसके बिना, आप यह देखने के लिए फ़ंक्शन को "अंदर" नहीं देख सकते हैं कि यह सूची के तत्वों को पुनर्व्यवस्थित कैसे करता है। वास्तव में, आपके प्रकार के हस्ताक्षर दिए गए पास किए गए फ़ंक्शन सूची में जो भी चाहते थे, वह कर सकते थे, जिसमें उन तत्वों को सम्मिलित करना शामिल था जो वहां से शुरू नहीं हुए थे!
{-# LANGUAGE RankNTypes #-}
import Data.List (sortBy)
import Data.Ord (comparing)
indexesOf :: (forall b. (b -> a) -> [b] -> [b]) -> [a] -> [Int]
indexesOf f xs = map snd $ f fst $ zip xs [0..]
foo :: (Ord a, Num a) => [a] -> [Int]
foo = indexesOf (filter . ((< 10) .))
bar :: Ord a => [a] -> [Int]
bar = indexesOf (sortBy . comparing)
ध्यान दें कि मैं भी पारित कर दिया समारोह के लिए एक अतिरिक्त तर्क जोड़ने के लिए किया था यह बताने के लिए भाग से की परवाह करता है निकालने के लिए करने के लिए:
यहाँ मैं क्या उच्च रैंक प्रकार का उपयोग कर काम करने के लिए मिल गया है जिस सूची में यह काम कर रहा है उसके तत्व। इसके बिना, आप केवल उन कार्यों का उपयोग करने में सक्षम होंगे जो सूची के तत्वों का निरीक्षण नहीं करते हैं, जैसे कि reverse
, और यह बहुत उपयोगी नहीं होगा।
उदाहरण GHCi में चलाएँ:
> let xs = [42, 0, 7, 3, 12, 17, 99, 36, 8]
> foo xs
[1,2,3,8]
> bar xs
[1,3,2,8,4,5,7,0,6]
> indexesOf (const reverse) xs
[8,7,6,5,4,3,2,1,0]
... मैं वास्तव में स्पष्ट नहीं कर रहा हूँ कि तुम क्या करने की कोशिश कर रहे हैं। –
मेरे पास एक सूची पर काम करने वाला एक फ़ंक्शन है, 'sort' कहें। अब क्रमबद्ध सूची के बजाय मैं तत्वों के * इंडेक्स * वापस प्राप्त करना चाहता हूं। जैसे '5.0, 8.0, 7.0] के लिए 'मैं नहीं चाहता' [5.0। 7.0, 8.0] 'लेकिन' [0,2,1] '। – Landei