Вычитание карри - PullRequest
       4

Вычитание карри

47 голосов
/ 15 декабря 2010

Если мы хотим отобразить функцию, которая увеличивает каждый элемент диапазона на 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 (предшественник).

Ответы [ 4 ]

42 голосов
/ 15 декабря 2010

Вы можете использовать функцию subtract вместо -, если хотите вычесть правую часть:

map (subtract 1) [1..5]
9 голосов
/ 16 декабря 2010

Поскольку - является и вычитанием инфикса, и отрицанием префикса, вы не можете использовать синтаксис (*x) (где * - оператор инфикса и значение xa) для -.К счастью, Prelude поставляется с negate и subtract, то есть \x -> -x и \x y -> y-x соответственно, так что вы можете использовать те, где вам нужно различать эти два.

2 голосов
/ 25 августа 2014

Мне не нравится subtract, потому что это смущает задом наперед. Я бы предложил

minus :: Num n => n -> n -> n
minus = (-)
infixl 6 `minus`

Тогда вы можете написать

map (`minus` 1) [1..5]
2 голосов
/ 16 декабря 2010

Я думаю, map (\x -> x - 1) [1..5] лучше передает намерение программиста, поскольку нет сомнений в том, что из чего вычитается.Я также нахожу ваше первое решение, map (+(-1)) [1..5], легко читаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...