2009-09-30 18 views
23

que tienen una función en Haskell que encuentra el valor máximo de una exponenciación de una lista:¿Cómo encontrar el índice del elemento en una lista en Haskell?

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

Lo que necesito es encontrar la ubicación de este valor máximo en la lista resultante. ¿Cómo voy a hacer esto?

Edición: He encontrado una solución que es la siguiente:

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

Respuesta

29

¿Cómo encontrar el índice del elemento máximo? ¿Qué tal probar todos los índices y verificar si son los máximos?

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

Pero esto suena como algo para lo que ya existe una función. Mi código será más legible, mantenible y probablemente incluso más eficiente si utilizo la función existente.

Así que debería preguntarle ASÍ cómo hacerlo, y en 15 minutos obtendré una respuesta y algunos comentarios sarcásticos. O - que podría pedir Hoogle y obtener una respuesta útil immidiately (como se sugiere Will)

$ 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

Bueno, parece que todos menos yo nacimos increíble ahora, ¿no? Pero realmente, ni siquiera sabía que existía Hoogle, y todavía estoy aprendiendo Haskell. Lo sabré mejor la próxima vez. –

+5

@Jonno_FTW: Me disculpo por ser sarcástico/cínico. No todos nacieron increíbles, y algunas personas están sin haber nacido de esa manera. Probablemente también te vuelvas increíble. Una buena regla en la programación Pythonesque es: si descubro que estoy codificando lo mismo cosa 3 veces, tal vez debería hacer una función para ello. En la programación de Haskellesque, la constante es e en lugar de 3. La misma regla también se aplica en meta-programación. Si descubres que necesitas encontrarnos Una buena cantidad de funciones, mejor trate de averiguar si hay una mejor manera de hacer este proceso de búsqueda de funciones, y luego descubra Hoogle. mtfbwu – yairchu

+5

@Jonno_FTW No empieces a usar Hoogle a menos que estés preparado para depender de él. Como programador de Haskell más veterano, recurro a Hoogle tan pronto como identifico los tipos implicados en lo que estoy tratando de hacer.Esto es un problema cuando estoy programando, p. Python, cuando me siento frustrado porque no hay Poogle. :( – kqr

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

Una muy buena herramienta para encontrar funciones Haskell es Hoogle. Le permite buscar por tipo de firma entre otras cosas.

Si quisiera hacer todo de una vez, recomendaría Data.List.mapAccumL, pasando el índice del mayor número encontrado hasta el momento como el acumulador.

+0

¿Puede decirnos cómo convertir la salida de 'elemIndex' a' Int' (no 'Maybe Int'? – Shashwat

+0

@Sashwat: http://stackoverflow.com/questions/3643172/using-maybe-type-in- haskell –

6

Esto probablemente no merece estar en una respuesta de su propia, pero no puedo comentar todavía. De todos modos, aquí es cómo habría escrito esta:

import Data.List 
import Data.Ord 

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

Si usted está haciendo el cálculo numérico en Haskell, es posible que desee ver en las bibliotecas que hacen que sea más fácil y más eficiente. Por ejemplo hmatrix tiene un método para maxIndex eficientes Vector s, la documentación de los cuales está aquí: https://hackage.haskell.org/package/hmatrix-0.17.0.1/docs/Numeric-LinearAlgebra-Data.html#g:14

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

Los nombres exactos de los métodos eran diferentes cuando la pregunta fue hecha originalmente pero la biblioteca estaba en torno a continuación también.

Cuestiones relacionadas