Pido disculpas por no encontrar un buen título para esta pregunta. Tengo problemas para expresar lo que necesito. Tengo un problema simple en Haskell y me pregunto cuál es el mejor enfoque para resolverlo.Patrón de diseño Functor en Haskell
Digamos que tengo una lista de números: [-3,2,1,2]
. Quiero devolver el valor con el valor absoluto más alto. Es decir, quiero regresar -3. Así que quiero:
f = maximum . map abs
El problema es, por supuesto, que este devuelve el valor calculado (3) y no el valor original (-3).
Pude encontrar una manera de hacer esto, tal vez asociar la lista original a una tupla de (originalValue, calculatdValue), encontrar la tupla cuyo snd es devuelto por mi función (máximo) y luego devolver el primero de esa tupla.
Pero esto parece un montón de "cañerías" para un problema simple como este, y me pregunto si hay alguna abstracción que me falta que resuelva esto. Es decir, generalmente hay un procedimiento que hago todo el tiempo, y quiero hacerlo de manera clara:
- Deseo tomar una lista de elementos.
- Quiero asignarlos a un cierto valor (digamos el valor absoluto)
- Luego quiero seleccionar uno basado en algunos criterios (digamos que quiero el máximo o quizás el mínimo).
- Pero luego quiero devolver el valor original. (Si la lista era
[-3,2,1,2]
y quiero devolver el valor con los valores más altos, entonces devolvería -3).
¿Existe una función de biblioteca para esto? ¿Hay un functor o una mónada para esto?
Creo que quiero una función con la firma:
f :: ([b] -> b) -> (a -> b) -> [a] -> a
decir
f maximum abs [-3,2,1,2]
Esto se siente muy "functory" a mí o tal vez "monádico".
o equivalentemente: 'maximumBy (abs comparar)' – interjay
Yo prefiero usar 'on', porque funciona con otras cosas, por ejemplo, nubBy ((==) 'on' abs). – augustss
¡Gracias por su solución! Hay un maximumBy y un minimumBy. ¿Hay un findFirstBy? Supongo que hay muchas funciones que toman una a y la convierten en b (abs), y luego muchas funciones que toman a [b] y la convierten en b (máximo). Y estoy tratando de encontrar una manera de componerlos generalmente sin cocinarlos. –