2009-09-30 22 views
23

मेरे पास Haskell में कोई फ़ंक्शन है जो किसी सूची से एक्सपोनेंटिएशन का अधिकतम मान पाता है:हास्केल में एक सूची में तत्व की अनुक्रमणिका ढूँढना?

prob99 = maximum $ map (\xs -> (head xs)^(head (tail xs))) numbers 

मुझे जो खोजना है वह परिणाम सूची में इस अधिकतम मान का स्थान है। मैं इसे किस तरह लूं?

संपादित करें: मुझे ऐसा समाधान मिला जो इस तरह जाता है:

n = [[519432,525806],[632382,518061].... 
prob99b [a,b] = b* (log a) 
answer = snd $ maximum (zip (map prob99b n) [1..]) 

उत्तर

29

अधिकतम तत्व की अनुक्रमणिका कैसे प्राप्त करें? सभी इंडेक्स को आजमाने और जांचने के बारे में कि वे अधिकतम हैं या नहीं?

ghci> let maxIndex xs = head $ filter ((== maximum xs) . (xs !!)) [0..] 

लेकिन ऐसा लगता है कि कोई फ़ंक्शन पहले से मौजूद है। यदि मैं मौजूदा फ़ंक्शन का उपयोग करता हूं, तो मेरा कोड अधिक पठनीय, रखरखाव योग्य और शायद अधिक कुशल होगा।

तो मुझे बस इतना पूछना चाहिए कि यह कैसे करें, और 15 मिनट में मुझे एक उत्तर और कुछ स्नैकी टिप्पणियां मिलेंगी। या - मैं hoogle पूछ सकते और एक उपयोगी प्रतिक्रिया तुरंत मिल (के रूप में विल सुझाव)

$ hoogle "Ord a => [a] -> Int" | head 

<Nothing relevant> 

$ # hmm, so no function to give me the index of maximum outright, 
$ # but how about finding a specific element, and I give it the maximum? 
$ hoogle "a -> [a] -> Int" | head 
Data.List elemIndex :: Eq a => a -> [a] -> Maybe Int 
Data.List elemIndices :: Eq a => a -> [a] -> [Int] 
+30

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

+5

@Jonno_FTW: मैं snarky/सनकी होने के लिए माफी माँगता हूँ। हर कोई भयानक पैदा नहीं हुआ था, और कुछ लोग इस तरह पैदा हुए बिना हैं। आप शायद भी भयानक हो सकते हैं। पायथोनस्क प्रोग्रामिंग में एक अच्छा नियम है: अगर मुझे पता चलता है कि मैं वही कोडिंग कर रहा हूं चीज 3 बार, शायद मुझे इसके लिए एक फ़ंक्शन बनाना चाहिए। Haskellesque प्रोग्रामिंग में निरंतर ई के बजाय ई है। उसी नियम मेटा प्रोग्रामिंग में भी लागू होता है। अगर आपको पता चलता है कि आपको हमें ढूंढना है ईफुल फ़ंक्शन बहुत अधिक है, यह पता लगाने का बेहतर प्रयास करें कि क्या इस फ़ंक्शन खोज प्रक्रिया को करने का बेहतर तरीका है, और फिर Hoogle खोजें। mtfbwu – yairchu

+5

@Jonno_FTW होगल का उपयोग शुरू न करें जब तक कि आप इस पर निर्भर होने के लिए तैयार न हों। एक अनुभवी हास्केल प्रोग्रामर के रूप में, जैसे ही मैं करने की कोशिश कर रहा हूं, उसमें शामिल प्रकारों की पहचान के रूप में, मैं होगल में बदल जाता हूं।यह एक समस्या है जब मैं प्रोग्रामिंग कर रहा हूं उदा। पायथन, जब मैं निराश हो जाता हूं क्योंकि कोई Poogle नहीं है। :( – kqr

31
import Data.List 
elemIndex 'b' "abc" === Just 1 

एक वास्तव में अच्छा उपकरण Hoogle है। आपको अन्य चीजों के बीच प्रकार हस्ताक्षर द्वारा खोज करने की अनुमति देता है।

यदि आप एक ही पास में सबकुछ करना चाहते हैं तो मैं डेटा.लिस्ट.मैपएक्कमएल की सिफारिश करता हूं, जो अब तक संचयी के साथ सबसे बड़ी संख्या के सूचकांक को पास करता है।

+0

क्या आप बता सकते हैं कि 'elemIndex' के आउटपुट को 'Int' (' शायद Int' ' – Shashwat

+0

@Sashwat के रूप में कैसे परिवर्तित करें: http://stackoverflow.com/questions/3643172/using-maybe-type-in- हैकेल –

6

यह शायद अपनी खुद की एक जवाब में होने के योग्य नहीं है, लेकिन मैं अभी तक कोई टिप्पणी नहीं कर सकते हैं। वैसे भी, यहाँ मैं यह कैसे लिखा होता है:

import Data.List 
import Data.Ord 

maxIndex :: Ord a => [a] -> Int 
maxIndex = fst . maximumBy (comparing snd) . zip [0..] 
1

आप हास्केल में संख्यात्मक गणना कर रहे हैं, तो आप पुस्तकालयों है कि यह आसान और अधिक प्रभावी बनाने के पर गौर कर सकते हैं। उदाहरण hmatrix के लिए कुशल Vector रों के लिए एक विधि maxIndex हैं, जिनमें से प्रलेखन यहाँ है: https://hackage.haskell.org/package/hmatrix-0.17.0.1/docs/Numeric-LinearAlgebra-Data.html#g:14

> maxIndex $ vector [1, 3, 2] 
1 

तरीकों के सटीक नाम अलग थे जब प्रश्न मूल रूप से कहा गया था लेकिन पुस्तकालय के चारों ओर तो भी था।

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