Trouver l'index de l'élément dans une liste dans Haskell?

j'ai une fonction dans Haskell qui trouve la valeur maximale d'une exponentiation à partir d'une liste:

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

Ce que j'ai besoin de trouver l'emplacement de cette valeur maximale dans la liste. Comment pourrais-je aller à ce sujet?

Edit: j'ai trouvé une solution qui va comme ceci:

n = [[519432,525806],[632382,518061]....
prob99b [a,b] = b* (log a)
answer = snd $ maximum (zip  (map prob99b n) [1..])
24
demandé sur Don Stewart 2009-09-30 13:18:16

4 réponses

Comment trouver l'index de l'élément maximum? Pourquoi ne pas essayer tous les index et vérifier s'ils sont le maximum?

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

Mais cela ressemble à quelque chose pour lequel une fonction existe déjà. Mon code sera plus lisible, maintenable, et probablement encore plus efficace, si j'ai utilisé la fonction existante.

alors je devrais juste demander comment le faire, et dans 15 minutes je vais obtenir une réponse et quelques commentaires sarcastiques. Ou je pourrais demander hoogle et obtenir une réponse immidiately (comme suggéré)

$ 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]
31
répondu yairchu 2009-09-30 10:22:43
import Data.List
elemIndex 'b' "abc" === Just 1

Un très bon outil pour trouver haskell fonctions Hoogle. Vous permet de rechercher par type de signature entre autres choses.

si vous vouliez tout faire en un seul passage, je recommanderais Data.Liste.mapAccumL, passant l'indice du plus grand nombre trouvé jusqu'à présent le long de l'accumulateur.

31
répondu Will 2009-09-30 09:35:20

cela ne mérite probablement pas d'être dans une réponse de sa part, mais je ne peux pas encore commenter. Quoi qu'il en soit, voici comment j'aurais écrit ceci:

import Data.List
import Data.Ord

maxIndex ::  Ord a => [a] -> Int
maxIndex = fst . maximumBy (comparing snd) . zip [0..]
6
répondu Maxime Henrion 2013-08-17 11:52:00

si vous faites le calcul numérique dans Haskell, vous pourriez vouloir regarder dans les bibliothèques qui le rendent plus facile et plus efficace. Par exemple,hmatrix a une méthode maxIndex pour l'efficacité Vector s, dont la documentation est ici: https://hackage.haskell.org/package/hmatrix-0.17.0.1/docs/Numeric-LinearAlgebra-Data.html#g:14

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

les noms exacts des méthodes étaient différents lorsque la question a été posée à l'origine, mais la bibliothèque était autour de trop.

1
répondu Daniel Landau 2016-05-12 20:44:03