Если мы хотим отобразить функцию, которая увеличивает каждый элемент диапазона на 1, мы могли бы написать
map (\x -> x + 1) [1..5]
, но я думаю, что большинство людей просто выберут
map (+1) [1..5]
вместо.Но это, очевидно, не работает с (-1), так как оно отрицательное.
Итак, первое, что пришло в голову, было
map (+(-1)) [1..5]
, которое имело бы смысл, учитывая, как определяется вычитаниев прелюдии (x - y = x + negate y
), но выглядит немного странно для меня.Затем я придумал
map (flip (-) 1) [1..5]
Мне это как-то кажется лучше, но, может быть, это слишком сложно.
Теперь я знаю, что ничего страшного, но мне интересно,Мне не хватает более очевидного способа написать это?Если нет, какой из двух способов вы бы предпочли?Я просто спрашиваю, потому что часто такие мелкие детали делают ваш код более идиоматичным и, следовательно, приятным для других разработчиков, которые должны его читать.
Решение
Теперь, когда я получил пару ответов, я думаю, что мой личный фаворит -
map (subtract 1) [1..5]
, за которым следует
map pred [1..5]
главным образом потому, что первый действительно явный, и никто не должен гадать / искать, что означает pred
(предшественник).