Я прошу прощения за то, что не придумал хорошего названия для этого вопроса. У меня проблемы с выражением того, что мне нужно. У меня есть простая проблема в Haskell, и мне интересно, как лучше всего ее решить.
Скажем, у меня есть список чисел: [-3,2,1,2]
. Я хочу вернуть значение с наивысшим абсолютным значением. То есть, я хочу вернуться -3. Поэтому я хочу:
f = maximum . map abs
Проблема заключается в том, что это возвращает вычисленное значение (3), а не исходное значение (-3).
Я мог бы найти способ сделать это, возможно, сопоставляя исходный список с кортежем (originalValue, calculatdValue), находя кортеж, snd которого возвращается моей функцией (максимум), а затем возвращает fst этого кортежа.
Но это похоже на "сантехнику" для простой проблемы, подобной этой, и мне интересно, есть ли какая-то абстракция, которую я пропускаю, которая решает это. То есть, это обычно процедура, которую я делаю все время, и я хочу, чтобы ее способ аккуратно выполнял:
- Я хочу взять список элементов.
- Я хочу сопоставить их с определенным значением (допустим, абсолютное значение)
- Затем я хочу выбрать один, основанный на некоторых критериях (скажем, я хочу максимум или, может быть, минимум).
- Но тогда я хочу вернуть исходное значение. (Если список был
[-3,2,1,2]
, и я хочу вернуть значение с наивысшим абс, то я бы вернул -3).
Есть ли для этого библиотечная функция? Есть ли функтор или монада для этого?
Я думаю, что мне нужна функция с сигнатурой:
f :: ([b] -> b) -> (a -> b) -> [a] -> a
то есть.
f maximum abs [-3,2,1,2]
Это кажется мне "функциональным" или "монадическим".